获取IP地址

服务器 IP(互联网协议)地址很少会更改,因为这可能会导致服务器上运行的 Web 服务中断。
如果网站更改其 IP 地址,则必须更新 DNS,这可能是一个需要数天才能完成的缓慢过程。

但是,访问者的 IP 经常会发生变化,因为 ISP(互联网服务提供商)可能会为其用户分配动态 IP。

要获取我们网站访问者的 IP 地址,我们可以使用 REMOTE_ADDR 变量:

echo $_SERVER['REMOTE_ADDR'] . PHP_EOL;

如果你有一个动态 IP,通常你需要做的就是重新启动你的互联网路由器来获得一个新的 IP 地址。
除此之外,一些用户还会通过使用代理或者 VPN 来隐藏他们的真实 IP 地址。
这使得仅根据 IP 地址无法唯一识别用户。

这并不意味着我们不应在日志中记录 IP 地址。
ISP 通常会保留日志,这使得识别在给定时间使用给定 IP 的用户成为可能。
事实上,一些代理和 VPN 也会保存日志。

有多种方法可以尝试获取代理或者 VPN 背后的真实 IP,但它们通常不可靠。
所以除非你真的需要,你能做的最好的事情就是通过 $_SERVER['REMOTE_ADDR'] 清楚地记录 IP。

获取网站 IP 地址的另一种方法是从命令提示符或者终端简单地 ping 服务器:

ping example.com
PING example.com (93.184.216.34) 56(84) bytes of data.
64 bytes from 93.184.216.34 (93.184.216.34): icmp_seq=1 ttl=53 time=103 ms
...

动态获取主机名

如果不想在脚本中对主机名进行硬编码,可以使用 HTTP_HOST 变量。
但是,这仅在脚本在 Web 服务器上运行时才有效。
如果我们从终端运行脚本,它将不起作用。

下面将动态获取主机名:

$host_info = shell_exec('nslookup ' . $_SERVER['HTTP_HOST']);
preg_match('/^.* ([0-9\:\.]+)\n/', $host_info, $matches);
echo $matches["1"];

别担心。
HTTP_HOST 变量对于注入攻击是安全的,因为它是由服务器填写的。

如果我们尝试从终端运行此脚本,很可能会导致如下错误:

PHP Notice:  Undefined index: HTTP_HOST in /var/www/server_ip.php on line 3

这是因为 HTTP_HOST 变量是由 Web 服务器填写的。
当我们从终端运行 PHP 时,$_SERVER 变量将不可用。

$_SERVER 超级全局是一个包含 Web 服务器提供给我们的不同信息的数组,虽然并非所有服务器都会提供相同的信息,但它通常非常可靠。

PHP:如何获取服务器IP地址

PHP 本身无法识别服务器的外部 IP 地址,因此我们必须使用 shell_exec 或者通过向要从中获取 IP 地址的网站发送 HTTP 请求来获取它。

我们可以使用 shell_exec 函数结合正则表达式来 grep 服务器的外部 IP 地址,为此,我们将在本地系统上调用 host 命令:

$host_info = shell_exec('nslookup example.com');
preg_match('/^.* ([0-9\:\.]+)\n/', $host_info, $matches);
echo $matches["1"];

这是为 Windows 和 Linux 系统设计的,适用于 IPv4 和 IPv6.
它也适用于 host 和 nslookup 命令。
主机命令在 Windows 上可能不可用。

我们也可以使用其他系统命令,但 nslookup 应该安装在大多数系统上。

获取本地服务器IP

要获取服务器的本地 IP 地址,我们可以简单地回显 $_SERVER['SERVER_ADDR'] 变量的内容。
但是,同样,这仅在我们在 Web 服务器上运行脚本时才可用。

echo 'The IP address of the server: ' . $_SERVER['SERVER_ADDR'];

在我们只希望 PHP 响应来自特定网络接口的请求的情况下,本地 IP 可能对我们有用。

日期:2020-06-02 22:15:56 来源:oir作者:oir