为啥 $_SERVER["REMOTE_ADDR"] 显示的 IP 与我的外部 IP 不同? [复制]

Posted

技术标签:

【中文标题】为啥 $_SERVER["REMOTE_ADDR"] 显示的 IP 与我的外部 IP 不同? [复制]【英文标题】:Why does $_SERVER["REMOTE_ADDR"] show a different IP than my external IP? [duplicate]为什么 $_SERVER["REMOTE_ADDR"] 显示的 IP 与我的外部 IP 不同? [复制] 【发布时间】:2011-08-31 03:57:00 【问题描述】:

可能重复:suddenly $_SERVER['REMOTE_ADDR'] is started returning 10.10.10.10 php

我一定错过了一些基本的东西。但是当我导航到一个显示 IP 的站点时,例如 http://www.whatsmyip.org/ 他们显示了一个特定的 IP。但是,当我在我网站上的某个页面上回显 $_SERVER["REMOTE_ADDR"] 时,它会显示不同的 IP。

这是为什么呢?我怎样才能通过 PHP 获取 whatsmyip.org 网站显示的相同 IP?

【问题讨论】:

你的服务器是什么?你到底看到了哪个IP?也许是 127.0.0.1 或 192.168.0.1 或类似的东西。 您的 PHP 服务器是否在具有重写/代理配置的 Apache 前端运行? @OZ_ 我看到的 ip 不是 127.0.0.1 或 192.168.0.1,它是一个“正常”的 IP。 【参考方案1】:

如果您的计算机与您的服务器在同一个网络上,在具有 NAT 的路由器后面,那么您可能会看到您的私有 IP

【讨论】:

确实如此,一分钟前测试过【参考方案2】:

首先让我澄清一些事情。

当您在本地主机上时,您不使用您的 ISP 来获取网页,因此您将使用 127.0.0.1::1 的内部 ip 用于 ipv6。

如果您通过某种路由器从本地网络获取页面,您将获得路由器分配的 ip,例如 192.168.1.90

如果您的网站托管在网络之外,那么您要求您的 ISP 为您获取该网站,这意味着您可以使用 whatsmyip 指定的 IP。

如果您使用诸如 Opendns 之类的 DNS 服务器,那么您要求您的 ISP 要求 Opendns 为您获取站点,并且由于显而易见的原因,open dns 使用一组与您不同的 ip。

可能有某种代理可能会产生干扰,因此您应该做的是反击,一个标准的代理站点应该将客户端 IP 转发到服务器,以防需要任何直接连接以及其他几个原因。

这就是说,您通常可以在检查 REMOTE_ADDR 之前检查其他几个参数来找到 IP,这是我为我的一个项目创建的一个类,但你可以选择你需要的:

https://github.com/AdminSpot/ASDDL/blob/master/system/classes/http/request.php

foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key)

    if (array_key_exists($key, $_SERVER) === true)
    
        foreach (explode(',', $_SERVER[$key]) as $ip)
        
            if (filter_var($ip, FILTER_VALIDATE_IP) !== false)
            
                $this->ip = $ip;
                break;
            
        
    

如您所见,数组的顺序非常重要:

HTTP_CLIENT_IP HTTP_X_FORWARDED_FOR HTTP_X_FORWARDED HTTP_X_CLUSTER_CLIENT_IP HTTP_FORWARDED_FOR HTTP_FORWARDED REMOTE_ADDR

注意REMOTE_ADDR 排在最后,这是因为这是不得已而为之,而且大多数情况下是不正确的。

【讨论】:

先检查REMOTE_ADDR是否为私有地址可能比较合适;其他值可能会在标头中被欺骗。 ***.com/questions/13818064/…【参考方案3】:

当您的网络服务器在您的本地计算机上时,它会为您提供本地 IP 地址,主要是 127.0.0.1,这是因为您没有从外部访问它。这就是原因。

【讨论】:

但是我的网络服务器不在我的本地机器上。 whatsmyip 站点的“正确”IP 是 213.115.255.236,而我自己回显的 IP 是 194.192.151.254 那么可能在您的局域网中...【参考方案4】:

什么是IP?

我唯一的想法是你可能会支持代理。可以吗?

【讨论】:

whatsmyip 站点的“正确”IP 是 213.115.255.236,而我自己回显的 IP 是 194.192.151.254【参考方案5】:

如果您的服务器是 Apache 并且您在 Apache 之前使用了一些前端,您可以尝试使用 mod_rpaf在 Debian 中:@987654321 @然后编辑配置:nano /etc/apache2/mods-enabled/rpaf.conf

<IfModule mod_rpaf.c>
RPAFenable On
RPAFsethostname Off
RPAFproxy_ips 127.0.0.1
</IfModule>

【讨论】:

【参考方案6】:

可能是因为您从本地主机访问它?你看到的IP是127.0.0.1,还是你的本地IP(192.168.x.x)?

【讨论】:

以上是关于为啥 $_SERVER["REMOTE_ADDR"] 显示的 IP 与我的外部 IP 不同? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

某些客户端在 $_SERVER['REMOTE_ADDR'] 中带有冒号的“垃圾”IP 地址

PHP的$_SERVER['REMOTE_ADDR']

如何伪造 $_SERVER['REMOTE_ADDR'] 变量?

$_SERVER['REMOTE_ADDR'] 可信吗? [复制]

负载均衡器 $_SERVER['REMOTE_ADDR'] 不工作

$_SERVER