获取用户当前位置

47

我该如何根据IP地址确定用户的当前位置(我猜是这样工作的)。


MaxMind GeoIP是一个很好的服务。他们还提供免费的城市级别查询服务。 - glomad
你可能想要查看在PHPClasses上找到的GeoIP Country Whois Locator - madkris24
7个回答

40
<?php
$user_ip = getenv('REMOTE_ADDR');
$geo = unserialize(file_get_contents("http://www.geoplugin.net/php.gp?ip=$user_ip"));
$country = $geo["geoplugin_countryName"];
$city = $geo["geoplugin_city"];
?>

5
Geoplugin不是最佳平台。它每分钟只能执行120个操作。以前我用过它,但最近我的服务器向它发出的所有请求都显示403错误。谁知道为什么。(我没有在一分钟内进行这些120个连接) - user5147563
4
在这些限制下毫无用处。 - Michael Rogers

35

已编辑

freegeoip.net更改为ipinfo.io

<?php    

function get_client_ip()
{
    $ipaddress = '';
    if (isset($_SERVER['HTTP_CLIENT_IP'])) {
        $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
    } else if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } else if (isset($_SERVER['HTTP_X_FORWARDED'])) {
        $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
    } else if (isset($_SERVER['HTTP_FORWARDED_FOR'])) {
        $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
    } else if (isset($_SERVER['HTTP_FORWARDED'])) {
        $ipaddress = $_SERVER['HTTP_FORWARDED'];
    } else if (isset($_SERVER['REMOTE_ADDR'])) {
        $ipaddress = $_SERVER['REMOTE_ADDR'];
    } else {
        $ipaddress = 'UNKNOWN';
    }

    return $ipaddress;
}
$PublicIP = get_client_ip();
$json     = file_get_contents("http://ipinfo.io/$PublicIP/geo");
$json     = json_decode($json, true);
$country  = $json['country'];
$region   = $json['region'];
$city     = $json['city'];
?>

6
虽然这段代码可能回答了问题,但是提供关于为什么和/或如何回答问题的额外上下文可以提高其长期价值。 - Jay Blanchard
1
有没有解决本地服务器的方法?我的IP地址一直显示为::1。 - Vince
1
@vince 本地主机始终返回 ::1 IP 地址。 - Naveen DA
7
deprecation_message: "此 API 端点已弃用并将于 2018 年 7 月 1 日停止工作。有关更多信息,请访问:https://github.com/apilayer/freegeoip#readme" - Moses Schwartz
1
在许多国家,这将为您提供ISP的位置而不是实际用户的位置。 - RiggsFolly
显示剩余2条评论

19
<?php
    $query = @unserialize (file_get_contents('http://ip-api.com/php/'));
    if ($query && $query['status'] == 'success') {
        echo 'Hey user from ' . $query['country'] . ', ' . $query['city'] . '!';
    }
    foreach ($query as $data) {
        echo $data . "<br>";
    }
?>

使用这个源代码尝试此代码。* 它有效!


8
要么做,要么不做。没有“尝试”这个选项。一个好的答案总是会解释所做的事情以及为什么以这种方式完成,不仅为了原帖作者,也为了未来访问 Stack Overflow 的用户。 - Jay Blanchard
这是一个免费的API吗? - Pisumathu

10

使用hostip.info服务尝试以下代码:

$country=file_get_contents('http://api.hostip.info/get_html.php?ip=');
echo $country;

// Reformat the data returned (Keep only country and country abbr.)
$only_country=explode (" ", $country);

echo "Country : ".$only_country[1]." ".substr($only_country[2],0,4);

1
可以使用 JSON 作为返回值,而不是使其返回爆炸。 http://api.hostip.info/get_json.php - Underdog
$json_string = 'http://api.hostip.info/get_json.php?ip='.$_SERVER['REMOTE_ADDR']; $jsondata = file_get_contents($json_string); $obj = json_decode($jsondata, true); - Underdog
该网站已不再可用。 - Rohlik

2
由于PHP依赖服务器,因此无法提供实时位置,只能提供静态位置。最好不要依赖JavaScript获取位置而是使用PHP。
但是需要将JavaScript数据发布到PHP,以便服务器上的程序可以轻松访问它。

1

IP地址提供的位置信息相对不可靠。如果位置信息不是必要的,您可以在JavaScript加载时使用Ajax获取位置信息。(此外,用户需要允许您访问该位置信息。)

HTML5地理位置


1
虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。仅有链接的答案如果链接页面发生更改可能会变得无效。 - Jay Blanchard

0

旧的freegeoip API现已过时,将于2018年7月1日停止使用。

新的API来自ipstack。您需要在ipstack中创建帐户。然后,您可以在API URL中使用访问密钥。

$url = "http://api.ipstack.com/122.167.180.20?access_key=ACCESS_KEY&format=1";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_PROXYPORT, 3128);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$response = curl_exec($ch);
curl_close($ch);
$response = json_decode($response);
$city  = $response->city; // You can get all the details like longitude, latitude from the '$response'.

更多信息请查看freegeoip(GitHub)。


1
这是一项付费服务。 - user2060451
1
问题不是关于免费服务。 - lalithkumar
他们有一个免费的、有限制的层级。 - mindmischief

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接