$ _SERVER [“REMOTE_ADDR”]提供服务器IP而不是访问者IP

时间:2010-11-23 23:25:20

标签: php

我正在尝试跟踪访问者的IP地址。使用$_SERVER["REMOTE_ADDR"]时,我获取服务器的IP地址而不是访问者的IP地址。我在多个位置的多台机器上尝试了这一点,它们都产生了完全相同的IP。是否有一些可能影响此问题的PHP /服务器设置?

8 个答案:

答案 0 :(得分:46)

REMOTE_ADDR无法信任。

无论如何,试试

$ipAddress = $_SERVER['REMOTE_ADDR'];
if (array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER)) {
    $ipAddress = array_pop(explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']));
}

编辑:此外,您的服务器的路由器是否启用了端口转发?它可能会弄乱数据包。

答案 1 :(得分:19)

  

使用$ _SERVER [“REMOTE_ADDR”]时,我得到的是服务器的IP地址,而不是访客的IP地址。

然后你的配置出了问题,或者很奇怪。

  • 您使用的是某种反向代理吗?在这种情况下,@ simshaun的建议可能有用。

  • 您的网络服务器配置中还有其他不寻常之处吗?

  • 你能展示你正在使用的PHP代码吗?

  • 您能说明地址的样子吗?它是本地的还是因特网地址?

答案 2 :(得分:11)

$_SERVER['REMOTE_ADDR']提供将请求发送到Web服务器的IP地址。这通常是访问者的地址,但在您的情况下,听起来有一种代理坐在Web服务器之前拦截请求,因此对于Web服务器,它看起来好像请求来自那里。

答案 3 :(得分:7)

不再查看未在预期标头中设置的IP地址。只需执行以下操作即可检查整个服务器变量并找出适合您情况的变量:

print_r($_SERVER);

答案 4 :(得分:3)

更换:

$_SERVER["REMOTE_ADDR"];

使用:

$_SERVER["HTTP_X_REAL_IP"];

为我工作。

答案 5 :(得分:1)

如果您使用的是 Cloudflare,那么这始终是为您提供服务的节点的 Cloudflare IP 地址。

在这种情况下,您从 $_SERVER['HTTP_FORWARDED_FOR'] 条目中获得真实 IP 地址,如其他答案所述。

答案 6 :(得分:0)

PHP 7.0 $ _SERVER变量已更改。 var_dump,看看它如何适合您的要求。

其中一些提供远程细节, REMOTE_ADDR HTTP_X_FORWARDED_FOR HTTP_CF_CONNECTING_IP HTTP_CF_IPCOUNTRY

答案 7 :(得分:0)

在PHP 7.4中,我这样做是这样的:

$ipaddress = '';
if (isset($_SERVER['REMOTE_ADDR']))
    $ipaddress = $_SERVER['REMOTE_ADDR'];
else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
    $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
else if(isset($_SERVER['HTTP_X_FORWARDED']))
    $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
    $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
else if(isset($_SERVER['HTTP_FORWARDED']))
    $ipaddress = $_SERVER['HTTP_FORWARDED'];
else if(isset($_SERVER['HTTP_CLIENT_IP']))
    $ipaddress = $_SERVER['HTTP_CLIENT_IP'];

但是请记住,REMOTE_ADDR是您可以获得的唯一可靠的IP地址。所有其他值都可以轻松操纵。从理论上讲,REMOTE_ADDRESS也是可行的,但这需要spoof the IP address