【问题标题】:Get user's current location获取用户当前位置
【发布时间】:2011-07-20 21:34:05
【问题描述】:

如何根据IP判断用户当前位置(我猜是这样)。

【问题讨论】:

    标签: php geolocation 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】:

    您可能想查看位于PHPClassesGeoIP 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

      【讨论】:

      • 这是一项付费服务​​。
      • 问题不在于免费服务
      • 他们有免费的。有限层
      猜你喜欢
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 2013-04-11
      相关资源
      最近更新 更多