diff --git a/server/app/common/http/middleware/RequestIpMiddleware.php b/server/app/common/http/middleware/RequestIpMiddleware.php new file mode 100644 index 0000000000000000000000000000000000000000..772d1d9054cef47a280f0048c5a9d2b5e5588856 --- /dev/null +++ b/server/app/common/http/middleware/RequestIpMiddleware.php @@ -0,0 +1,36 @@ +ip(); + + // 获取配置的 IP 地址头顺序 + $ipHeaders = Config::get('project.cdn.ip_headers', []); + + foreach ($ipHeaders as $header) { + if ($request->header($header)) { + $ip = $request->header($header); + $ip = explode(',', $ip)[0]; // 取第一个 IP 地址 + break; + } + } + + // 使用反射来设置 protected 属性 + $reflection = new ReflectionClass($request); + $property = $reflection->getProperty('realIP'); + $property->setAccessible(true); + $property->setValue($request, $ip); + + return $next($request); + } +} diff --git a/server/app/middleware.php b/server/app/middleware.php index 9f8e3c5e68428c12fd3697f13ad89044dfc53978..a8f1427bc0369073a508961454b04fd3e8354b0d 100644 --- a/server/app/middleware.php +++ b/server/app/middleware.php @@ -1,6 +1,8 @@ '1.9.4', + 'version' => '1.9.5', + + // CDN 配置 + 'cdn' => [ + // 针对 CDN 的 IP转发获取,用来获取用户真实IP,从上到下按顺序去获取 + 'ip_headers' => [ + 'EO-Connecting-IP', // 腾讯云 EO 头 + 'X-REAL-IP', // Nginx 头 - 大多数CDN转发用到的 + 'X-Forwarded-For', // Nginx 头 - 部分CDN转发用到的 + ], + ], // 官网 'website' => [