【问题标题】:Getting users ip in php [duplicate]在php中获取用户IP [重复]
【发布时间】:2015-11-17 12:01:52
【问题描述】:

我编写此代码是为了在我的网站上获取用户 ip,目前我正在我的本地主机中检查它,但它返回类似于 ::1 的内容。 我正在使用 xampp 包,我的代码是

<?php
    echo $_SERVER['REMOTE_ADDR'];
?>

我会得到我的 ip 127.0.0.1,因为我在本地主机上,但它返回 ::1。

【问题讨论】:

    标签: php ip


    【解决方案1】:

    根据这个answer SO

    Localhost 始终转换为 IPv4 中的环回 IP 地址 127.0.0.1,或 IPv6 中的 ::1

    所以得到::1 实际上是预期的行为。

    如果您想将::1 转换为与127.0.0.1 等效的IPv4,可以使用PHP 的inet_ntop() 函数。请参阅此question 了解更多信息。

    $packed = chr(127) . chr(0) . chr(0) . chr(1);
    $expanded = inet_ntop($packed);
    
    /* Outputs: 127.0.0.1 */
    echo $expanded;
    
    $packed = str_repeat(chr(0), 15) . chr(1);
    $expanded = inet_ntop($packed);
    
    /* Outputs: ::1 */
    echo $expanded;
    

    【讨论】:

      【解决方案2】:

      IP 地址“::1”是新的 Internet 寻址系统。如果您正在编写代码来处理 IP 地址,那么会越来越多地遇到这些。

      【讨论】:

      • ::1 是一个确切的 IP 地址,但它是 127.0.0.1 的 IPv6 等价物
      • 我不认为你可以。 IPv4 大约有 43 亿个地址,而 IPv6 大约有 340,282,366,920,938,463,463,374,607,431,768,211,456
      • 如果您获得 ::1,您的网络似乎已设置为使用 IPv6。如果你运行的是 Linux 或 FreeBSD,你可以强制它使用 IPv4 和 IPv6。
      【解决方案3】:

      您可以将 dig 与 shell_exec 一起使用

      $ip = trim(shell_exec("dig +short myip.opendns.com @resolver1.opendns.com"));
      echo ("My public IP: ".$ip);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-19
        • 2011-09-11
        • 1970-01-01
        • 2022-01-21
        • 2010-10-25
        • 2014-06-13
        • 2013-10-31
        • 2013-12-24
        相关资源
        最近更新 更多