我想从访问者的IP地址中检索他们的城市、州和国家等信息,这样我就可以根据他们的位置定制我的网页。在PHP中是否有一种好的、可靠的方法来做到这一点?我使用JavaScript作为客户端脚本,PHP作为服务器端脚本,MySQL作为数据库。


当前回答

如果您需要从IP地址获取位置,您可以使用可靠的地理IP服务,您可以在这里获得更多详细信息。支持IPv6。

作为奖励,它允许检查ip地址是否tor节点,公共代理或垃圾邮件。

你可以使用javascript或php如下所示。

Javascript代码:

$(document).ready(function () {
        $('#btnGetIpDetail').click(function () {
            if ($('#txtIP').val() == '') {
                alert('IP address is reqired');
                return false;
            }
            $.getJSON("http://ip-api.io/json/" + $('#txtIP').val(),
                 function (result) {
                     alert('City Name: ' + result.city)
                     console.log(result);
                 });
        });
    });

Php代码:

$result = json_decode(file_get_contents('http://ip-api.io/json/64.30.228.118'));
var_dump($result);

输出:

{
"ip": "64.30.228.118",
"country_code": "US",
"country_name": "United States",
"region_code": "FL",
"region_name": "Florida",
"city": "Fort Lauderdale",
"zip_code": "33309",
"time_zone": "America/New_York",
"latitude": 26.1882,
"longitude": -80.1711,
"metro_code": 528,
"suspicious_factors": {
"is_proxy": false,
"is_tor_node": false,
"is_spam": false,
"is_suspicious": false
}

其他回答

这个问题是保密的,我知道。然而,我在这里没有看到答案,我看到的是很多人展示了他们从同样的问题中得出的答案。

目前有五个具有不同程度功能的区域互联网注册中心作为与知识产权所有权有关的第一个接触点。这个过程是不断变化的,这就是为什么这里的各种服务有时工作,有时不工作的原因。

Who Is(显然)是一个古老的TCP协议,然而,它最初的工作方式是通过连接到43端口,这使得通过租用连接、通过防火墙等进行路由成为问题。

目前,大多数Who Is都是通过RESTful HTTP完成的,ARIN、RIPE和APNIC都有RESTful服务。LACNIC的返回值是503,而AfriNIC显然没有这样的API。(不过,它们都有在线服务。)

这将为你提供IP注册所有者的地址,但不是你的客户的位置,你必须从他们那里获得,而且你必须要求得到它。此外,在验证您认为是发起者的IP时,代理是您最不需要担心的问题。

人们不喜欢自己被跟踪的概念,所以——我的想法是——直接从你的客户那里得到信息,并得到他们的许可,并期望很多人对这个概念有所回避。

我喜欢Maxmind的免费GeoLite City,它最适用 如果它不够精确,你可以从它升级到付费版本。包括一个PHP API,以及其他语言的API。如果你将Lighttpd作为web服务器运行,你甚至可以使用一个模块为每个访问者获取SERVER变量中的信息,如果这是你所需要的。

我应该补充的是,还有一个免费的Geolite Country(如果你不需要确定IP来自哪个城市,这个会更快)和Geolite ASN(如果你想知道谁拥有IP),最后所有这些都可以在你自己的服务器上下载,每月更新一次,使用提供的api可以非常快地查找,因为他们说“每秒数千次查找”。

你需要使用外部服务…例如http://www.hostip.info/,如果你谷歌搜索“geo-ip”,你可以得到更多的结果。

主机ip API是基于HTTP的,因此您可以根据需要在PHP或JavaScript中使用它。

本·道林回复中的服务已经改变了,所以现在更简单了。要找到位置,只需做:

// no need to pass ip any longer; ipinfo grabs the ip of the person requesting
$details = json_decode(file_get_contents("http://ipinfo.io/"));
echo $details->city; // city

坐标以单一字符串形式返回,如'31,-80',因此从那里你只需:

$coordinates = explode(",", $details->loc); // -> '31,-89' becomes'31','-80'
echo $coordinates[0]; // latitude
echo $coordinates[1]; // longitude

使用谷歌api:

<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script>
contry_code = google.loader.ClientLocation.address.country_code
city = google.loader.ClientLocation.address.city
region = google.loader.ClientLocation.address.region
</script>