为什么$ _SERVER [“REMOTE_ADDR”]显示的IP与外部IP不同?

时间:2011-05-23 13:21:03

标签: php apache nginx ip

  

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

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

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

6 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:3)

首先让我澄清一些事情。

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

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

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

如果您使用的是DNS服务器,例如Opendns,那么您要求您的ISP要求Opendns为您提取网站,并且打开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是最后一次,这是因为这是最后的手段,大部分时间都不正确。

答案 2 :(得分:2)

当您的网络服务器在本地计算机上时,它将为您提供本地IP地址127.0.0.1,这是因为您不是从外部访问它。这是理由。

答案 3 :(得分:1)

什么是IP?

我唯一想到的是你可能会落后于代理。可能是吗?

答案 4 :(得分:1)

如果你的服务器是Apache而你在Apache之前使用了一些前端,你可以尝试使用 mod_rpaf
在Debian中:
aptitude install libapache2-mod-rpaf
然后编辑配置:
nano /etc/apache2/mods-enabled/rpaf.conf

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

答案 5 :(得分:0)

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