【问题标题】:Cannot get correct IP for user using PHP无法为使用 PHP 的用户获取正确的 IP
【发布时间】:2012-04-06 01:24:42
【问题描述】:

我正在尝试从 IP 地址获取国家/地区。 问题是某些计算机上没有显示用户 IP。一些测试它的用户获得 IP,但其他用户没有(在同一个 WiFi 网络上)。

这是我的代码。怎么了?

function VisitorIP()
{
    if (!empty($_SERVER['HTTP_CLIENT_IP']))   //check ip from share internet
    {
      $ip=$_SERVER['HTTP_CLIENT_IP'];
    }
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))   //to check ip is pass from proxy
    {
      $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
      $ip=$_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}

$ip_address = VisitorIP();

$geodata = file_get_contents('http://api.ipinfodb.com/v3/ip-country/?key=0000&ip=' . $ip_address . '&format=json');

$decoded = json_decode($geodata);

$country = strtolower($decoded->countryCode);

【问题讨论】:

  • 总能看看phpBB。尽管有各种条件(包括代理),但他们有一个非常完整的方法来获取用户的 IP。
  • var_dump($ip_address) 对于没有给您的访问者。里面有什么?
  • 访问者必须有一个 IP 地址,否则他们无法收到响应。您还应该专门使用$_SERVER['REMOTE_ADDR'],所有其他值都无法确认并且可能是伪造的。
  • 当你调用VisitorIP时,“没有IP”的用户会得到什么?每个 TCP 连接必须有一个 IP,所以你的函数应该返回一些东西。但是,您盲目地相信 CLIENT_IP 和 FORWARDED_FOR 变量设置正确 - 它们是使用提供的数据,可以伪造/伪造。
  • 顺便说一句,phpBB3/common.php 代码突出显示 IP 查找。

标签: php geo


【解决方案1】:

怎么了?

一切。

服务器唯一可用的 IP 是存储在 $_SERVER['REMOTE_ADDR'] 变量中的一个。
所以,你必须使用这个,而不是各种来源不明的 HTTP 标头。

【讨论】:

  • 我需要访问我网站的用户的 IP 地址,而不是服务器 ip。
  • 如果你没有注意到它被命名为 REMOTE ADDR。
  • 好的,抱歉。但是 $_SERVER['REMOTE_ADDR'] 在很多情况下并没有给出可用的 IP。
  • 恰恰相反,您尝试使用的所有这些 HTTP 标头 在许多情况下都无法使用。而 REMOTE_ADDR 总是 包含正确的 IP 地址。无论如何,这是您拥有的唯一可靠信息。如果您不喜欢它,您可能希望发明另一个互联网,但目前它就是这样运作的。不过,我不会说它是如此“无法使用”。出于地理定位的目的,它非常好。有任何统计数据可以显示这些“许多案例”之一吗?
猜你喜欢
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-19
  • 2014-11-26
  • 2022-01-20
  • 1970-01-01
  • 2021-08-04
相关资源
最近更新 更多