如何使用PHP获取用户的真实IP


How to get real IP of user using PHP?

我一直在尝试获取用户的真实IP地址,而不是代理地址。为此,我这样做了:

$ip1 = $_SERVER['REMOTE_ADDR'];
$ip2 = $_SERVER['HTTP_X_FORWARDED_FOR'];
$ip3 = $_SERVER['HTTP_FORWARDED'];
mail("me@domain.com", "Report", "IP1 is $ip1, IP2 is $ip2, IP3 is $ip3 .");

但是当用户使用代理时,上面的脚本获取代理地址而不是真实的IP地址:

IP is [proxy_addr_here], IP2 is  , IP3 is    .

有没有办法得到真正的IP就像什么atismyip.com告诉(它告诉真实的IP地址,代理地址和useragent)?

Update: Whatismyip告诉我这个"你的IP地址是:[我的真实IP]"代理:[我的代理地址]城市:Alipur国家/地区:德里国家:IN -ISP: Bharti Airtel Ltd"

为什么它收集所有的细节如此准确,而不是我的PHP脚本?

你可以做

$ip= isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? 
     $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];

但这也不是100%。在如此多的NAT防火墙之间,每天都不能保证获得真实用户的IP,更不用说代理了。

编辑

要回答关于它们如何显示更多信息的编辑,您可以使用该语言的许多特性来获得更多请求细节。例如:

print_r(getallheaders());

也可以用

 print_r($_SERVER);

并从中提取所需的信息。

编辑2

即使你最喜欢的whatismyip.com报告

您的IP位置可以使用我们的IP查找工具找到。由于许多不同的因素,没有IP查找工具是100%准确的。其中一些因素包括IP所有者在哪里注册,控制IP的代理机构在哪里,代理,蜂窝IP等。如果您在美国,而IP的控制机构位于加拿大,则IP地址查找结果很可能显示为加拿大。在美国使用Verizon网络的黑莓用户中,显示加拿大IP是很常见的。

参考

你可能还会问,好吧,那为什么我不能至少得到他们显示的?我相信他们已经投入了大量的研究和资源来建立这个工具,它不是一行PHP代码,事实上根本不知道这个网站是不是用PHP编写的。再做一些研究,你就可以尝试匹配他们的查找了。

你可以试试这个…

<?PHP
function getUserIP()
{
    $ipaddress = '';
    if (getenv('HTTP_CLIENT_IP'))
        $ipaddress = getenv('HTTP_CLIENT_IP');
    else if(getenv('HTTP_X_FORWARDED_FOR'))
        $ipaddress = getenv('HTTP_X_FORWARDED_FOR');
    else if(getenv('HTTP_X_FORWARDED'))
        $ipaddress = getenv('HTTP_X_FORWARDED');
    else if(getenv('HTTP_FORWARDED_FOR'))
        $ipaddress = getenv('HTTP_FORWARDED_FOR');
    else if(getenv('HTTP_FORWARDED'))
       $ipaddress = getenv('HTTP_FORWARDED');
    else if(getenv('REMOTE_ADDR'))
        $ipaddress = getenv('REMOTE_ADDR');
    else
        $ipaddress = 'Unknown IP Address';
    return $ipaddress;
}
$user_ip = getUserIP();
echo $user_ip; // Output IP address (Ex: 123.345.456.678)
?>