获取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 地址,因此我们必须使用 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 可能对我们有用。