我一直在尝试获取用户的真实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)
?>