我想检测用户的国家/地区,所以要在我的php表单的下拉列表中预选它。我尝试通过获取用户IP地址来实现,然后我使用Maxmind Geoip从ip获取国家/地区名称。一切正常,除非用户在vpn后面,这就是当我/她不在代理或使用VPN时,我无法获得用户的真实IP(以及国家)。
我读了一些类似的帖子,例如How to get Real IP from Visitor?和What is the most accurate way to retrieve a user's correct IP address in PHP?,并尝试了 $ _SERVER ['REMOTE_ADDR'],$ _SERVER ['HTTP_X_FORWARDED_FOR'],getenv('REMOTE_ADDR')等,但当我落后于vpn时,他们都没有返回原始IP。
我真的很想知道是否有任何方法可以让用户获得真正的ip(例如我很想知道像http://whatismyip.com这样的网站如何返回原来的ip?)。 如果确实不可能像PHP in this post那样在php中获取这个原始ip,有没有其他方法来检测用户国家? (我也考虑过浏览器语言,但我认为在我的情况下它不会有用,因为例如许多用户可能会在属于其他国家时将其设置为英语)
任何想法都会受到高度赞赏,
答案 0 :(得分:0)
理论上,如果您可以访问ISP等,总是可以跟踪IP。但是,从程序员的角度来看,没有一定的方法可以知道访问者的真实IP地址,因此您永远不会有100 % 准确性。您可以采取一些措施来提高准确性,例如您建议$ _SERVER [' REMOTE_ADDR'],$ _SERVER [' HTTP_X_FORWARDED_FOR']。也许其他人可以帮助您打击更多可以提高准确性的方法
答案 1 :(得分:0)
由于IP块不断在ISP中移动,因此为您的应用程序收集最新数据库并非易事。
以下是其中一个免费API的示例:
function get_ip_details($ip_address)
{
//function to find country, city and country code from IP.
//verify the IP.
ip2long($ipAddr)== -1 || ip2long($ipAddr) === false ? trigger_error("Invalid IP", E_USER_ERROR) : "";
//get the JSON result from hostip.info
$result = file_get_contents("http://api.hostip.info/get_json.php?ip=".$ip_address);
$result = json_decode($result, 1);
//return the array containing city, country and country code
return $result;
}
结果类似于this json response
此外,大多数现代网络浏览器已经内置了这个未来,因此您可以在没有第三方API的情况下即时获取用户的国家/地区:Demo
编辑:在OP案例中,无法识别用户的国家/地区。