使用最新的GeoLite2 IP数据库搜索IP 54.73.154.147,我得到以下结果:
美国西雅图
但IP地址实际上来自爱尔兰的AWS服务器。如果我向GeoIP Precision测试页面提交相同的IP(https://www.maxmind.com/en/geoip-demo)我得到了正确的结果:
爱尔兰爱尔兰都柏林
有人能想到我为什么得到这样错误的结果的原因吗?
之所以会得到两个不同的结果,是因为它们只是数据库的不同版本,而且在它们的web界面上搜索的结果显然更准确、更及时。GeoLite2不是很准确,您需要每周更新它才能收到准确的信息,因为IP地址每分钟都在变化。例如,我购买了几个IP地址,今天可以使用一个,明天可以随意切换到另一个。更大的公司更经常这样做,这些IP地址中的大多数可以从一个国家转移到另一个国家。
如果你只想坚持使用MaxMind产品,你可以使用这个url来请求json:
https://www.maxmind.com/geoip/v2.1/city/{{ip.address}}?use-downloadable-db=1&demo=1
请注意,理论上每天只允许25个请求(但很容易被破解)。不要问我如何破解它,因为它违反了堆栈溢出的规则。
正如@michael所指出的,如果geolite的数据库出错,您将无能为力。这是另一种选择:userinfo.io。它实际上是几个数据库的合并,因此可以更准确。
我用你的IP测试了它,它返回了正确的位置。
{
"ip_address": "54.73.154.147",
"position": {
"latitude": 53.3331,
"longitude": -6.2489
},
"continent": {
"name": "Europe",
"code": "EU"
},
"country": {
"name": "Ireland",
"code": "IE"
},
"city": {
"name": "Dublin"
}
}
您当前可以使用javascript包装器或java包装器。
我遇到了完全相同的问题。我的EC2服务器在爱尔兰,但geoap显示美国。
我转到了freegeop.net,这在这个案例中似乎是准确的。
PHP中的用法示例:
$json_data = file_get_contents("http://freegeoip.net/json/" . $hostname);
return json_decode($json_data, TRUE);
此脚本将解决您的问题我已经用你的ip地址测试过了,它给出了正确的结果
<?php
/*Get user ip address*/
//$ip_address=$_SERVER['REMOTE_ADDR'];
$ip_address="54.73.154.147";
/*Get user ip address details with geoplugin.net*/
$geopluginURL='http://www.geoplugin.net/php.gp?ip='.$ip_address;
$addrDetailsArr = unserialize(file_get_contents($geopluginURL));
/*Get City name by return array*/
$city = $addrDetailsArr['geoplugin_city'];
/*Get Country name by return array*/
$country = $addrDetailsArr['geoplugin_countryName'];
$latitude = $addrDetailsArr['geoplugin_latitude'];
$logitude = $addrDetailsArr['geoplugin_longitude'];
/*Comment out these line to see all the posible details*/
/*echo '<pre>';
print_r($addrDetailsArr);
die();*/
if(!$city){
$city='Not Define';
}if(!$country){
$country='Not Define';
}
echo '<strong>IP Address</strong>:- '.$ip_address.'<br/>';
echo '<strong>City</strong>:- '.$city.'<br/>';
echo '<strong>Country</strong>:- '.$country.'<br/>';
echo '<strong>Latitude</strong>:- '.$latitude.'<br/>';
echo '<strong>Longitude</strong>:- '.$logitude.'<br/>';
?>