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

时间:2014-08-11 06:39:10

标签: php ip

我一直试图获取用户的真实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就像whatismyip.com所说的那样(它告诉真实的IP地址,代理地址和用户)?

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

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

2 个答案:

答案 0 :(得分:2)

你可以做到

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

但即使这不是100%。现在获取真实用户的IP并不能保证中间有这么多NAT防火墙,更不用说代理了。

修改

要回答关于它们如何向您显示更多信息的编辑,您可以使用该语言的许多功能来获取更多请求详细信息。例如,尝试

print_r(getallheaders());

然后你也可以使用

 print_r($_SERVER);

从那里提取所需的信息。

修改2

甚至你最喜欢的whatismyip.com报道

  

您可以使用我们的IP查找工具找到您的IP位置。由于许多不同的因素,没有IP查找工具100%准确。其中一些因素包括知识产权所有者注册的地方,控制知识产权的机构所在地,代理商,移动电话IP等。如果您在美国且知识产权的控制机构位于加拿大,机会是IP地址查找结果将显示为加拿大。在美国,显示加拿大知识产权在Verizon网络上的黑莓用户中很常见。

<强> Reference

你可能仍然会问,那么为什么我至少得不到他们所展示的内容?我确定他们已经在设置该工具方面投入了大量的研究和资源,而不是一行的PHP代码,实际上并不知道该网站是否完全用PHP编写。还有一些研究,您将尝试匹配他们的查找。

答案 1 :(得分:0)

你可以试试这个......

<?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)

?>