【问题标题】:PHP check if IPAddress is localPHP检查IPAddress是否是本地的
【发布时间】:2014-07-25 10:55:48
【问题描述】:

我可以检查一个 ip 是否在私有网络中吗?

<?php
function isLocalIPAddress($IPAddress)
{
    return ( !filter_var($IPAddress, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE ) );
}

var_dump( isLocalIPAddress('127.0.0.1') ); // false
var_dump( isLocalIPAddress('192.168.1.20') ); // true
var_dump( isLocalIPAddress('64.233.160.0') ); // false

为什么isLocalIPAddress('127.0.0.1')false 而不是true

127.0.0.1不是私网IP吗?


更新

我使用的解决方案:

<?php
function isLocalIPAddress($IPAddress)
{
    if( strpos($IPAddress, '127.0.') === 0 )
        return true;

    return ( !filter_var($IPAddress, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE ) );
}

【问题讨论】:

    标签: php networking ip


    【解决方案1】:

    根据test run,我们可以看到PHP 5.2.0 → 5.3.5 的输出是false,而PHP 5.3.6 → 7.0.0beta1 和hhvm-3.3.1 → 3.8.0 的输出是true

    要解决您的问题,您可以检查 php 版本,如果它在第一个范围内,请添加:

    function isLocalIPAddress($IPAddress)
    {
        if($IPAddress == '127.0.0.1'){return true;} <-- add this
        return ( !filter_var($IPAddress, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE ) );
    }
    

    【讨论】:

    • 我已经用我将使用的解决方案更新了问题。
    • @ar099968 - 应该这样做,很高兴我帮助了
    【解决方案2】:
    filter_var($addr, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE);
    

    这是我的生产标志。此处不允许使用私有 IP 类和环回接口。

    【讨论】:

      【解决方案3】:

      根据http://www.php.net/manual/en/filter.filters.flags.php 127.0.0.1 不包含在 FILTER_FLAG_NO_PRIV_RANGE 或 FILTER_FLAG_NO_RES_RANGE 中。

      编辑:

      那里还有一条关于如何处理环回的评论。

      【讨论】:

      • 您正在处理的评论是 3 岁,并且 127.0.0.1 是在更高版本的 php 中添加的
      • 是的,但是他有可能使用的是旧版本的 PHP,因为它不适合他。
      • 是的,可能有,但您的回答没有解决这个问题。你需要提到这两种情况:)
      猜你喜欢
      • 2011-10-23
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-09
      相关资源
      最近更新 更多