laravel,php中获取访客真实ip

在laravel中,下面两种方法都能获得用户IP:
// request获取ip
 $request->getClientIp();
 $request->ip();
这是在没有代理的情况下,但是有时候我们的业务使用了反向代理、负载均衡、cdn加速等等,上述两种方法就无法获取到真实ip,也就没法满足我们的业务线

举例:公司网络使用拨号或者代理模式访问我们的业务系统此时$request->getClientIp() 和 $request->ip() 只能获取到访客的公网出口统一的ip地址,拿不到真实的访客ip

解决关键词 HTTP_X_FORWARDED_FOR

如果一个 HTTP 请求到达服务器之前,经过了三个代理 Proxy1、Proxy2、Proxy3,IP 分别为 IP1、IP2、IP3,用户真实 IP 为 IP0,那么按照 XFF 标准,服务端最终会收到以下信息:

X-Forwarded-For: IP0, IP1, IP2

代码片 解觉方案.

 function getRealIp()
{
    
    $ip = data_get($_SERVER, 'HTTP_X_FORWARDED_FOR') ?:#获取用户ip
    if (strstr($ip, ",")) {#如果经过代理有多个ip,循环处理
        $ip_arr = explode(',', $ip);
        foreach ($ip_arr as $ip) {
            $ipint = sprintf('%u', ip2long($ip));#ip2long — 将 IPV4 的字符串互联网协议转换成长整型数字
            if ($ipint >= 0 && $ipint <= 50331647 || // {"0.0.0.0","2.255.255.255"},
                $ipint >= 167772160 && $ipint <= 184549375 || // {"10.0.0.0","10.255.255.255"},
                $ipint >= 2130706432 && $ipint <= 2147483647 || // {"127.0.0.0","127.255.255.255"},
                $ipint >= 2851995648 && $ipint <= 2852061183 || // {"169.254.0.0","169.254.255.255"}
                $ipint >= 2886729728 && $ipint <= 2887778303 || // {"172.16.0.0","172.31.255.255"},
                $ipint >= 3221225984 && $ipint <= 3221226239 || // {"192.0.2.0","192.0.2.255"},
                $ipint >= 3232235520 && $ipint <= 3232301055 || // {"192.168.0.0","192.168.255.255"},
                $ipint >= 4294967040 && $ipint <= 4294967295 // {"255.255.255.0","255.255.255.255"}
                ){
                	continue;
                }else{
               		break;
                }
                
                
                    
        }
    }
    return trim($ip);
}

总结:HTTP_X_FORWARDED_FOR可获取真实ip和代理ip,此方法框架通用

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值