$_SERVER['REMOTE_ADDR'] 给出服务器的 IP 地址而不是用户的 IP 地址
$_SERVER['REMOTE_ADDR'] gives the IP Address of the server instead of the IP Address of the user
编辑:
我已经清理了浏览器的缓存,现在我的 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;
}
但同样,它 returns 127.0.0.1
。
任何替代解决方案?
这意味着您的服务器可能位于某种反向代理之后,例如负载平衡器或 CDN。您的 PHP 服务器未接收到来自客户端的 直接 连接,这些连接之前经过一些中间层,因此您的服务器只能看到该中间层的 IP。
在这种情况下,中间代理通常会将某些指定 HTTP header 中的实际客户端 IP 转发到您的 PHP 服务器。那就是当你非常明确和非常有选择性地使用 $_SERVER['HTTP_X_FORWARDED']
; 之类的东西时。 当且仅当当且仅当您知道自己处于这种情况以及您可以信任哪个 HTTP header 时。 请参阅您的 host/proxy/network 情况的文档它会告诉你 header 使用什么。
编辑:
我已经清理了浏览器的缓存,现在我的 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;
}
但同样,它 returns 127.0.0.1
。
任何替代解决方案?
这意味着您的服务器可能位于某种反向代理之后,例如负载平衡器或 CDN。您的 PHP 服务器未接收到来自客户端的 直接 连接,这些连接之前经过一些中间层,因此您的服务器只能看到该中间层的 IP。
在这种情况下,中间代理通常会将某些指定 HTTP header 中的实际客户端 IP 转发到您的 PHP 服务器。那就是当你非常明确和非常有选择性地使用 $_SERVER['HTTP_X_FORWARDED']
; 之类的东西时。 当且仅当当且仅当您知道自己处于这种情况以及您可以信任哪个 HTTP header 时。 请参阅您的 host/proxy/network 情况的文档它会告诉你 header 使用什么。