From c42c8ddae1621e6cbbec15514df15694ec915b94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=A2=E5=8F=B0=E5=BA=B7=E9=99=B6=E7=A7=91=E6=8A=80?= Date: Thu, 12 Sep 2024 16:48:26 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0CDN=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=E4=B8=8B=E7=9A=84IP=E8=8E=B7=E5=8F=96=E5=85=AC=E5=85=B1?= =?UTF-8?q?=E4=B8=AD=E9=97=B4=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../http/middleware/RequestIpMiddleware.php | 36 +++++++++++++++++++ server/app/middleware.php | 2 ++ server/config/project.php | 12 ++++++- 3 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 server/app/common/http/middleware/RequestIpMiddleware.php diff --git a/server/app/common/http/middleware/RequestIpMiddleware.php b/server/app/common/http/middleware/RequestIpMiddleware.php new file mode 100644 index 000000000..772d1d905 --- /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 9f8e3c5e6..a8f1427bc 100644 --- a/server/app/middleware.php +++ b/server/app/middleware.php @@ -1,6 +1,8 @@ '1.9.1', + 'version' => '1.9.2', + + // CDN 配置 + 'cdn' => [ + // 针对 CDN 的 IP转发获取,用来获取用户真实IP,从上到下按顺序去获取 + 'ip_headers' => [ + 'EO-Connecting-IP', // 腾讯云 EO 头 + 'X-REAL-IP', // Nginx 头 - 大多数CDN转发用到的 + 'X-Forwarded-For', // Nginx 头 - 部分CDN转发用到的 + ], + ], // 官网 'website' => [ -- Gitee