【问题标题】:$_SERVER["REMOTE_ADDR"] gives server IP rather than visitor IP$_SERVER["REMOTE_ADDR"] 给出服务器 IP 而不是访客 IP
【发布时间】:2011-05-14 19:23:41
【问题描述】:

我正在尝试跟踪访问者的 IP 地址。使用$_SERVER["REMOTE_ADDR"] 时,我得到的是服务器的IP 地址而不是访问者的IP 地址。我在多个位置的多台机器上尝试了这个,它们都产生了完全相同的 IP。是否有一些 PHP/服务器设置可能会影响这一点?

【问题讨论】:

  • 您能否将我们链接到该网站以确认?您是否还检查了$_SERVER['HTTP_CLIENT_IP']$_SERVER['HTTP_X_FORWARDED_FOR'] 的值(如果存在)?
  • 是的,我试过了。我将继续询问 Unix 管理员可能是什么问题。这在我们的任何其他服务器上都不是问题。
  • 这可能是网络服务器的错误配置或正在使用的某种代理。如果你知道它是谁的IP,这个谜可能会被解开:)
  • 这也发生在我身上。我有一个安装了 Ubuntu 16.04 和 VestaCP 的 VPS。如果我使用 HTTP_X_REAL_IP 那么它是正确的。 Vesta 正在使用 NGINX,所以我想这就是问题所在(反向代理)

标签: php


【解决方案1】:

使用 $_SERVER["REMOTE_ADDR"] 时,我得到的是服务器的 IP 地址,而不是访问者的。

那么您的配置有问题或奇怪。

  • 您是否在使用某种反向代理?在这种情况下,@simshaun 的建议可能会奏效。

  • 您的网络服务器配置中还有其他异常之处吗?

  • 您能展示一下您正在使用的 PHP 代码吗?

  • 你能显示地址的样子吗?是本地地址还是互联网地址?

【讨论】:

    【解决方案2】:

    $_SERVER['REMOTE_ADDR'] 给出了请求被发送到 Web 服务器的 IP 地址。这通常是访问者的地址,但在您的情况下,听起来好像有某种代理位于拦截请求的网络服务器之前,因此对于网络服务器来说,请求似乎来自那里。

    【讨论】:

    • 我开发了一个 LIKE SYSTEM,我可以在其中获得用户的真实 IP。现在,我面临一个问题。我已连接到家庭 Wi-Fi。当我单击笔记本电脑上的 LIKE 按钮时,它可以工作。当我在不同的浏览器中检查相同的内容时,它可以工作。但是,当我在手机上打开网站时,我的数据库中会注册两个 IP。一种是路由器IP,另一种是手机IP。但是,移动 IP 每隔几秒钟就会发生变化。所以,我的系统认为这是不同的人,并将同一个人的投票计为不同的人。
    • 我认为人们普遍认为,将 IP 地址用于任何类型的用户 ID 是一个非常糟糕的主意,因为 IP 地址有很多方式会出错、更改、重复。寻找另一种机制。 @KalpeshSingh
    • 感谢您的回复。我会尽快找到更好的解决方案。
    【解决方案3】:

    不要再寻找未在预期标头中设置的 IP 地址。只需执行以下操作即可检查整个服务器变量并找出适合您情况的变量:

    print_r($_SERVER);
    

    【讨论】:

    • 我找到了我正在寻找的东西:HTTP_X_REAL_IP : json_encode($_SERVER)
    【解决方案4】:

    替换:

    $_SERVER["REMOTE_ADDR"];
    

    与:

    $_SERVER["HTTP_X_REAL_IP"];
    

    为我工作。

    【讨论】:

      【解决方案5】:

      如果您使用的是 Cloudflare,那么这始终是为您服务的节点的 Cloudflare IP 地址。

      在这种情况下,您可以从 $_SERVER['HTTP_FORWARDED_FOR'] 条目中获取真实 IP 地址,如其他答案中所述。

      【讨论】:

        【解决方案6】:

        PHP 7.0 $_SERVER 变量已更改。 var_dump 看看它是否符合您的要求。

        其中一些提供远程详细信息的是, 远程地址 HTTP_X_FORWARDED_FOR HTTP_CF_CONNECTING_IP HTTP_CF_IPCOUNTRY

        【讨论】:

          【解决方案7】:

          试试这个

          $_SERVER['HTTP_CF_CONNECTING_IP'];
          

          而不是

          $_SERVER["REMOTE_ADDR"];
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-06-04
            • 1970-01-01
            • 1970-01-01
            • 2016-05-03
            • 1970-01-01
            • 2016-05-12
            • 1970-01-01
            相关资源
            最近更新 更多