获取用户当前位置
Posted
技术标签:
【中文标题】获取用户当前位置【英文标题】:Get user's current location 【发布时间】:2011-07-20 21:34:05 【问题描述】:如何根据IP判断用户当前位置(我猜是这样)。
【问题讨论】:
【参考方案1】:<?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"];
?>
【讨论】:
Geoplugin 不是最好的平台。它限制为每分钟 120 个动作。它对我有用,但最近它开始对来自我的服务器的所有请求显示 403。谁知道为什么。 (我没有在一分钟内建立那 120 个连接) 对这些限制毫无用处。【参考方案2】:已编辑
把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'];
?>
【讨论】:
虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。 本地主机服务器有解决方法吗?我的 IP 地址一直显示为 ::1 @vince Localhost 总是返回 ::1 ip 地址 deprecation_message:“此 API 端点已弃用,将于 2018 年 7 月 1 日停止工作。有关详细信息,请访问:github.com/apilayer/freegeoip#readme”, 检查所有转发的ip有什么必要?我认为只需要检查if(isset(HTTP_X_FORWARDED_FOR))
。【参考方案3】:
<?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>";
?>
使用此源尝试此代码。它有效!
【讨论】:
做或不做。没有“尝试”。 好的答案将始终解释所做的事情以及为什么以这种方式完成,不仅是为了 OP,也是为了 SO 的未来访问者。跨度> 【参考方案4】:使用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);
【讨论】:
您可以使用 json 作为返回,而不是爆炸返回。 api.hostip.info/get_json.php $json_string = 'api.hostip.info/…; $jsondata = file_get_contents($json_string); $obj = json_decode($jsondata, true); 此站点不再可用。【参考方案5】:MaxMind GeoIP 服务很好。他们还提供免费的城市级查询服务。
【讨论】:
虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。【参考方案6】:您可能想查看位于PHPClasses 的GeoIP Country Whois Locator。
【讨论】:
虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。【参考方案7】:由于PHP依赖服务器,无法提供实时定位,只能提供静态定位,最好避免依赖JS定位,而不是使用php。但是需要将js数据发布到php,以便在服务器上轻松编程
【讨论】:
【参考方案8】:IP 为您提供了一个非常不可靠的位置,如果最初获取位置并不重要,您可以在加载时使用 JS 对位置进行 Ajax。 (此外,用户需要授予您访问它的权限。)
Html5 Geolocation
【讨论】:
虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。【参考方案9】:旧的 freegeoip API 现已弃用,将于 2018 年 7 月 1 日停用。
新 API 来自 https://ipstack.com。您必须在 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 .
欲了解更多信息,请点击此处:/ https://github.com/apilayer/freegeoip
【讨论】:
这是一项付费服务。 问题不在于免费服务 他们有免费的。有限层以上是关于获取用户当前位置的主要内容,如果未能解决你的问题,请参考以下文章