-1

我知道这个问题被问了很多次,但我没有得到正确的答案。在这里,我使用以下代码从我的托管网站获取最终用户系统 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 地址。

4

2 回答 2

2

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

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

于 2013-09-17T13:41:31.330 回答
1

由于IPv4网络中通常的网络地址转换,您不能这样做。这意味着 NAT 后面的所有 IP 地址都将作为单个 IP 地址(这将是网关地址)可见,因此,您将只能获得网关地址。

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

请记住,HTTP_X_FORWARDED_FOR它是一个非强制性的HTTP 请求标头,因此可以发送或不发送。它可以是任何东西(使用 Firefox 下的 LiveHTTPHeaders 之类的东西,我可以在此标头中发送“Hello,world!”,脚本会看到)。

于 2013-09-17T13:42:43.040 回答