IP地址的位置检测技术

问题描述:

什么是IP地址的位置检测技术?
我知道看
$_SERVER['HTTP_ACCEPT_LANGUAGE'](不准确的,但大多是有用的检测位置,例如,如果一个IP范围内的用户设定的法国自己的浏览器,则意味着在此范围)属于法国

gethostbyaddr($_SERVER['REMOTE_ADDR'])(看看国家代码顶级域名)
则可能是域名注册gethostbyaddr($_SERVER['REMOTE_ADDR'])
有时:
$HTTP_USER_AGENT(Firefox的用户代理字符串中有语言代码,而不是准确的,但大多可以用来检测位置)
IP地址的位置检测技术

另外我知道如何获得时区,但它不适用于新的浏览器。 此外,还有css issue,它可以检测访问者的历史,它可以用来查看他/她访问过的谷歌和维基百科页面(google.co.uk,google.com.tr)

但是城市呢?

+1

多个副本,包括http://stackoverflow.com/questions/283016/know-a-good-ip-address -geolocation-service和http://stackoverflow.com/questions/2244989/need-a-client-side-api-for-determing-geo-location-of-ip-addresses – skaffman 2010-04-04 14:39:58

+3

不,他们要求服务,我问这些服务如何检测到位置。 – ilhan 2010-04-07 18:16:49

如果没有将IP地址映射到城市/国家/提供商的数据库,则无法执行此操作。有商业产品,如ip2location,你可以使用。 AFAIK虽然没有免费的替代方案,但维护这样一个IP数据库是相当多的工作。的免费替代品:GeoIP2

更新: 有几件事情,让你建立这样一个数据库,如果你投入足够的时间:

  1. 使用由regional and local registries提供的数据库找到一个IP的所有者。
  2. 许多ISP使用命名模式来定位用户。如果您进行反向DNS查找,有时甚至可以用明文形式读取城市名称 。有时候更隐秘的是 。例如我目前有p5dcf6c4a.dip.t-dialin.net,我没有 的想法,命名方案是..
  3. 使用traceroute。如果你不能识别用户的位置,你仍然可以找出其上行链路的位置
+0

是的,我知道他们,但我想知道他们如何创建他们自己的数据库。 – ilhan 2010-04-04 14:00:55

有数据库(其中一些是免费的)可用于将IP转换为城市:

例如:http://www.maxmind.com/app/geolitecity在这些数据库被编译为whois信息

+0

我知道,它对大国非常有用,但对保加利亚来说并不准确。我的所有访客都来自保加利亚东南部,但它显示他们来自中西部(首府城市)。 – ilhan 2010-04-04 13:59:39

的一种方式。例如,要确定69.59.196.211位置:

FMARK @ home的:〜$主机69.59.196.211 211.196.59.69.in-addr.arpa域名指针stackoverflow.com。 FMARK @ home的:〜$ whois的stackoverflow.com在.com和

域名注册服务器2.0版

域名.NET 域,现在可以用 许多不同的竞争注册。

<SNIP> 

>注册人:stackoverflow.com LLC
410克莱顿大道埃尔塞里托,加利福尼亚州 94530名美国

<SNIP> 

显然,这不是巨大的准确,所以更复杂的技术据称被使用。

如果你寻找一些复制 - 粘贴的解决方案,我foudn此代码:

function countryCityFromIP($ipAddr) 
{ 
//function to find country and city from IP address 
//Developed by Roshan Bhattarai http://roshanbh.com.np 

//verify the IP address for the 
ip2long($ipAddr)== -1 || ip2long($ipAddr) === false ? trigger_error("Invalid IP", E_USER_ERROR) : ""; 
$ipDetail=array(); //initialize a blank array 

//get the XML result from hostip.info 
$xml = file_get_contents("http://api.hostip.info/?ip=".$ipAddr); 

//get the city name inside the node <gml:name> and </gml:name> 
preg_match("@<Hostip>(\s)*<gml:name>(.*?)</gml:name>@si",$xml,$match); 

//assing the city name to the array 
$ipDetail['city']=$match[2]; 

//get the country name inside the node <countryName> and </countryName> 
preg_match("@<countryName>(.*?)</countryName>@si",$xml,$matches); 

//assign the country name to the $ipDetail array 
$ipDetail['country']=$matches[1]; 

//get the country name inside the node <countryName> and </countryName> 
preg_match("@<countryAbbrev>(.*?)</countryAbbrev>@si",$xml,$cc_match); 
$ipDetail['country_code']=$cc_match[1]; //assing the country code to array 

//return the array containing city, country and country code 
return $ipDetail; 

} 

希望这有助于人。

+1

http://api.hostip.info似乎不再可用 – shenkwen 2016-05-04 21:55:28

而不是使用第三方API我建议你使用自己托管的IP记录。这篇文章解释了你更多的

http://www.techsirius.com/2014/05/simple-geo-tracking-system.html

基本上他们正在使用的MaxMind的国家城市的IP数据库记录[http://dev.maxmind.com/geoip/geoip2/geolite2/]有一些修改。之后,一个简单的查询

$ip = $_SERVER['REMOTE_ADDR']; 
$long = sprintf('%u', ip2long($ip)); 
$sql = "SELECT * FROM `geo_ips` WHERE '$long' BETWEEN `ip_start` AND `ip_end`"; 

如果地理定位功能是不是为你的项目一个很大的需求,你可以使用简单的东西是这样的:

$geotxt=''; 
$dt=json_decode(@file_get_contents('https://freegeoip.net/json/'.$_SERVER['REMOTE_ADDR'])); 
if ($dt!=null) $geotxt=$dt->country_name.', '.$dt->region_name.', '.$dt->city; 
echo $geotxt; 

你必须考虑到freegeoip有每小时10k的限制。

U可以使用此功能

function ip_info(){ 
      return $data = json_decode(file_get_contents('http://ip-api.com/json/'),true); 
     } 

调用函数

$info = ip_info(); 
var_dump($info); 
+0

如何将IP地址传递给除当前IP地址之外的此功能?当有人在表单中输入数据时,我正在记录IP地址,我只想验证正在输入垃圾邮件或垃圾的用户 – 2017-05-19 23:12:20

+0

@KimWilson在下面看到我的答案 – Jonathan 2017-09-05 18:13:26

大多数现有数据库的使用数据的聚集国际登记ARIN,AfriNIC查询,ANIC等以及用户提交地点。更复杂的技术包括拓扑和约束地理定位。

我运行我自己的API https://ipdata.co,提供了几个数据点,包括国家,城市,地区,纬度/经度等。

php > $data = json_decode(file_get_contents('https://api.ipdata.co/69.59.196.211'),true); 
php > echo $data['country_name']; 
//United States 
php > echo $data['city']; 
//Albany 

您可以使用数据库或API(托管数据库)将IP地址映射到其位置(城市,国家,邮政编码),时区等。

下面是使用API​​

curl https://ipapi.co/city/ 
> Mountain View 

curl https://ipapi.co/country/ 
> US 

curl https://ipapi.co/timezone/ 
> America/Los_Angeles 

更多在这里的一个例子:Location from IP address