四十二、逐行阅读Yii2.0.43_Yii框架文件yii\web\Request.php(9)

一、getUserIpFromIpHeaders方法,从请求头检索客户端ip

    // 返回客户端ip地址
    protected function getUserIpFromIpHeaders()
    {
        $ip = $this->getSecureForwardedHeaderTrustedPart('for');

        if ($ip !== null && preg_match(
            '/^\[?(?P<ip>(?:(?:(?:[0-9a-f]{1,4}:){1,6}(?:[0-9a-f]{1,4})?(?:(?::[0-9a-f]{1,4}){1,6}))|(?:[\d]{1,3}\.){3}[\d]{1,3}))\]?(?::(?P<port>[\d]+))?$/',
            $ip,
            $matches
        )) {
            $ip = $this->getUserIpFromIpHeader($matches['ip']);
            if ($ip !== null) {
                return $ip;
            }
        }


        foreach ($this->ipHeaders as $ipHeader) {
            if ($this->headers->has($ipHeader)) {
                $ip = $this->getUserIpFromIpHeader($this->headers->get($ipHeader));
                if ($ip !== null) {
                    return $ip;
                }
            }
        }

        return null;
    }

二、getUserIp方法,返回用户ip地址

    public function getUserIP()
    {
        // 优先从ip头检测客户端ip
        $ip = $this->getUserIpFromIpHeaders();

        return $ip === null ?
            // 客户ip
            $this->getRemoteIP() :
            $ip;
    }

三、getUserIpFromIpHeader方法,从请求头检索ip地址

    //从ip头返回用户ip
    protected function getUserIpFromIpHeader($ips)
    {
        $ips = trim($ips);
        if ($ips === '') {
            return null;
        }

        $ips = preg_split('/\s*,\s*/', $ips, -1, PREG_SPLIT_NO_EMPTY);
        krsort($ips);
        $validator = $this->getIpValidator();
        $resultIp = null;

        foreach ($ips as $ip) {
            $validator->setRanges('any');

            //检查ip格式
            if (!$validator->validate($ip) /* checking IP format */) {
                break;
            }

            // ip格式正确,以下又不符合条件,
            //终止检测
            $resultIp = $ip;
            $isTrusted = false;

            foreach ($this->trustedHosts as $trustedCidr => $trustedCidrOrHeaders) {
                if (!is_array($trustedCidrOrHeaders)) {
                    $trustedCidr = $trustedCidrOrHeaders;
                }

                $validator->setRanges($trustedCidr);
                if ($validator->validate($ip) /* checking trusted range */) {
                    $isTrusted = true;
                    break;
                }
            }

            if (!$isTrusted) {
                break;
            }
        }

        return $resultIp;
    }

总结:

 阅读了3个方法:

  • getUserIpFromIpHeaders方法,从请求头检索客户端ip
  • getUserIp方法,返回用户ip地址
  • getUserIpFromIpHeader方法,从请求头检索ip地址
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值