使用php获取最终用户的IP地址

时间:2013-09-17 13:38:05

标签: php ip

我知道很多次都会问过这个问题,但我没有从我这边得到正确答案。在这里,我使用以下代码从我的托管网站获取最终用户系统IP地址。

function ipCheck() {
    if (getenv('HTTP_CLIENT_IP')) {
        $ip = getenv('HTTP_CLIENT_IP');
    }
    elseif (getenv('HTTP_X_FORWARDED_FOR')) {
        $ip = getenv('HTTP_X_FORWARDED_FOR');
    }
    elseif (getenv('HTTP_X_FORWARDED')) {
        $ip = getenv('HTTP_X_FORWARDED');
    }
    elseif (getenv('HTTP_FORWARDED_FOR')) {
        $ip = getenv('HTTP_FORWARDED_FOR');
    }
    elseif (getenv('HTTP_FORWARDED')) {
        $ip = getenv('HTTP_FORWARDED');
    }
    else {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}
echo ipCheck();

在我的本地网络中,此代码运行正常。它正确地给了我的本地IP 192.168.xxx.xxx。但是当我在我的网站上运行此代码时,它提供了一些其他的IP地址。

2 个答案:

答案 0 :(得分:2)

工作正常。它将为您提供的IP地址将是您的外部IP地址(转到谷歌并搜索“我的IP地址是什么”,它应该显示您的外部IP是什么,以便您可以验证您的代码是否正确)。

在本地网络外部托管的服务器上使用时,这不会显示您的本地IP地址192.168.x.x,因为请求中未提供该信息。该IP地址仅在您的本地网络上有效。

答案 1 :(得分:1)

由于Network Address Translating网络中常见的IPv4,您无法执行此操作。这意味着NAT后面的所有IP地址都将作为单个IP地址(这将是网关地址)可见,因此,您只能获得网关地址。

除此之外,还有Proxy Servers,可以隐藏或更改真实客户端(即他的网关)地址。所以在一般情况下你的问题有否定答案,即不可能。

请记住,HTTP_X_FORWARDED_FOR是非强制性HTTP-request header,因此可以发送或不发送。它可以是任何东西(在Firefox下我喜欢LiveHTTPHeaders,我可以在这个标题和脚本中发送'Hello,world!')。