laravel 更换成swoole方式后client真实IP获取

本文介绍在Laravel框架结合Swoole时如何正确获取客户端的真实IP地址。由于Swoole改变了请求处理的方式,传统的IP获取方法不再适用。文中提供了一种新的实现方案,通过设置受信任的代理来确保获取到正确的IP。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

正常laravel框架获取客户端真实IP使用的是:
 

if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}elseif(isset($_SERVER['HTTP_CLIENT_IP'])){
    $ip = $_SERVER['HTTP_CLIENT_IP'];
}else{
    $ip = $_SERVER['REMOTE_ADDR'];
}
$ip_arr = explode(',', $ip);
return $ip_arr[0];

但当框架增加swoole,更改方式后,这种方式就获取不到真实IP了,需要更换成:

use Symfony\Component\HttpFoundation\Request as RequestAlias;

$request->setTrustedProxies($request->getClientIps(), RequestAlias::HEADER_X_FORWARDED_FOR);
$realIp = $request->ip();

就可以啦

整体流程:
1. 增加中间键:

class RealIp
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
     */
    public function handle(Request $request, Closure $next)
    {
        $request->setTrustedProxies($request->getClientIps(), RequestAlias::HEADER_X_FORWARDED_FOR);
        $realIp = $request->ip();
        Log::info("client 真实IP1:" . $realIp);
        request()->offsetSet('clientRealIp', $realIp);
        return $next($request);
    }
}

2. 在 Kernel.php 中,增加公共中间键配置:

'api' => [
            Throttle::class,   //按单接口限流
            FilterParamNull::class,
            CommonHeader::class,
            RealIp::class,  //真实IP
        ],

3. 在业务代码中可通过 

$realIp = request()->get('clientRealIp'); 

使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值