编辑:
我已经清理了浏览器的缓存,现在我的PHP代码正在运行。
我知道已经存在类似的问题,我无法相信$_SERVER['REMOTE_ADDR']
来获得访问者的真实IP地址。
我正在本地主机上测试我的网站,并且我没有任何代理,我正在尝试显示我的IP地址,但是$_SERVER['REMOTE_ADDR']
给出了127.0.0.1
,即服务器的IP地址。
如果我将相同的代码在线放置在服务器中,则我会再次收到服务器的IP地址。
我尝试了以下失败的尝试:
function get_visitor_ip() {
$ipaddress = '';
if (isset($_SERVER['HTTP_CLIENT_IP'])) {
$ipaddress .= $_SERVER['HTTP_CLIENT_IP'] . ' - ';
}
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ipaddress .= $_SERVER['HTTP_X_FORWARDED_FOR']. ' - ';
}
if(isset($_SERVER['HTTP_X_FORWARDED'])) {
$ipaddress .= $_SERVER['HTTP_X_FORWARDED']. ' - ';
}
if(isset($_SERVER['HTTP_FORWARDED_FOR'])) {
$ipaddress .= $_SERVER['HTTP_FORWARDED_FOR']. ' - ';
}
if(isset($_SERVER['HTTP_FORWARDED'])) {
$ipaddress .= $_SERVER['HTTP_FORWARDED']. ' - ';
}
if(isset($_SERVER['REMOTE_ADDR'])) {
$ipaddress .= $_SERVER['REMOTE_ADDR']. ' - ';
}
if($ipaddress == '') {
$ipaddress = 'UNKNOWN';
}
return $ipaddress;
}
但是,它再次返回127.0.0.1
。
还有其他解决方案吗?
答案 0 :(得分:2)
这意味着您的服务器可能位于某种反向代理之后,例如负载平衡器或CDN。您的PHP服务器未从客户端接收直接连接,这些连接之前经过某个中间设备,因此该中间设备的IP是服务器所能看到的。
在这种情况下,中间代理通常将某些指定的HTTP标头中的实际客户端IP转发到您的PHP服务器。那是当您非常明确和非常有选择地使用类似$_SERVER['HTTP_X_FORWARDED']
的东西时; 当且仅当当您知道自己处于这种情况下并且可以信任哪个HTTP标头时。请查阅有关主机/代理/网络情况的文档,它会告诉您什么标题。