33 lines
1.1 KiB
PHP
33 lines
1.1 KiB
PHP
|
|
<?php
|
|||
|
|
|
|||
|
|
namespace App\Http\Middleware;
|
|||
|
|
|
|||
|
|
use Closure;
|
|||
|
|
use Illuminate\Http\Request;
|
|||
|
|
use Symfony\Component\HttpFoundation\Response;
|
|||
|
|
|
|||
|
|
class CloudflareProxies
|
|||
|
|
{
|
|||
|
|
/**
|
|||
|
|
* 文件功能:强制信任并解析 CDN 传导的真实客户端 IP。
|
|||
|
|
* 解决 Herd 环境 / Nginx 本地反代时,丢失 X-Forwarded-For 导致全员 IP 变成 127.0.0.1 的问题。
|
|||
|
|
*/
|
|||
|
|
public function handle(Request $request, Closure $next): Response
|
|||
|
|
{
|
|||
|
|
// 优先采纳 Cloudflare 的 CF-Connecting-IP
|
|||
|
|
if ($request->hasHeader('CF-Connecting-IP')) {
|
|||
|
|
$realIp = $request->header('CF-Connecting-IP');
|
|||
|
|
$request->server->set('REMOTE_ADDR', $realIp);
|
|||
|
|
$request->headers->set('X-Forwarded-For', $realIp);
|
|||
|
|
}
|
|||
|
|
// 其次兜底常见的国内 CDN 厂商(如腾讯云 EdgeOne / 阿里云 DCDN)
|
|||
|
|
elseif ($request->hasHeader('X-Real-IP')) {
|
|||
|
|
$realIp = $request->header('X-Real-IP');
|
|||
|
|
$request->server->set('REMOTE_ADDR', $realIp);
|
|||
|
|
$request->headers->set('X-Forwarded-For', $realIp);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return $next($request);
|
|||
|
|
}
|
|||
|
|
}
|