From 21aa4f7b2b1cdbfb6e8adf0a33ee2425ae46143e Mon Sep 17 00:00:00 2001 From: kuaifan Date: Fri, 28 Mar 2025 15:36:29 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=9C=B0=E5=9D=80?= =?UTF-8?q?=E5=8F=AF=E8=83=BD=E5=AD=98=E5=9C=A8localhost=E7=9A=84=E6=83=85?= =?UTF-8?q?=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Events/WorkerStartEvent.php | 2 ++ app/Http/Middleware/WebApi.php | 3 ++ app/Module/Base.php | 18 +++++------ app/Services/RequestContext.php | 56 +++++++++++++++++++++++++++++++++ 4 files changed, 70 insertions(+), 9 deletions(-) diff --git a/app/Events/WorkerStartEvent.php b/app/Events/WorkerStartEvent.php index 405e70293..18c499aa8 100644 --- a/app/Events/WorkerStartEvent.php +++ b/app/Events/WorkerStartEvent.php @@ -3,6 +3,7 @@ namespace App\Events; use App\Models\WebSocket; +use App\Services\RequestContext; use Hhxsv5\LaravelS\Swoole\Events\WorkerStartInterface; use Swoole\Http\Server; @@ -25,5 +26,6 @@ class WorkerStartEvent implements WorkerStartInterface private function handleFirstWorkerTasks() { WebSocket::query()->delete(); + RequestContext::clearBaseUrlCache(); } } diff --git a/app/Http/Middleware/WebApi.php b/app/Http/Middleware/WebApi.php index f9788e09e..172a4d231 100644 --- a/app/Http/Middleware/WebApi.php +++ b/app/Http/Middleware/WebApi.php @@ -24,6 +24,9 @@ class WebApi RequestContext::set('start_time', microtime(true)); RequestContext::set('header_language', $request->header('language')); + // 更新请求的基本URL + RequestContext::updateBaseUrl($request); + // 加载Doo类 Doo::load(); diff --git a/app/Module/Base.php b/app/Module/Base.php index 9e73125b0..1d01c491e 100755 --- a/app/Module/Base.php +++ b/app/Module/Base.php @@ -802,16 +802,16 @@ class Base str_starts_with(str_replace(' ', '', $str), "data:image/") ) { return $str; - } else { - if (RequestContext::has('fill_url_remote_url')) { - return "{{RemoteURL}}" . $str; - } - try { - return url($str); - } catch (\Throwable) { - return self::getSchemeAndHost() . "/" . $str; - } } + if (RequestContext::has('fill_url_remote_url')) { + return "{{RemoteURL}}" . $str; + } + try { + $fillUrl = url($str); + } catch (\Throwable) { + $fillUrl = self::getSchemeAndHost() . "/" . $str; + } + return RequestContext::replaceBaseUrl($fillUrl); } /** diff --git a/app/Services/RequestContext.php b/app/Services/RequestContext.php index b773b3495..25090b833 100644 --- a/app/Services/RequestContext.php +++ b/app/Services/RequestContext.php @@ -139,4 +139,60 @@ class RequestContext self::$context[$requestId] ??= []; self::$context[$requestId] = array_merge(self::$context[$requestId], $data); } + + /** + * 更新请求的基本URL + * + * @param Request $request + * @return void + */ + public static function updateBaseUrl($request) + { + if ($request->path() !== 'api/system/setting') { + return; + } + $schemeAndHttpHost = $request->getSchemeAndHttpHost(); + if (str_contains($schemeAndHttpHost, '127.0.0.1') || str_contains($schemeAndHttpHost, 'localhost')) { + return; + } + \Cache::forever('RequestContext::base_url', $schemeAndHttpHost); + } + + /** + * 替换请求的基本URL + * + * @param string $url + * @return string + */ + public static function replaceBaseUrl(string $url): string + { + // 先提取主机部分 + $pattern = '/^(https?:\/\/[^\/?#:]+(:\d+)?)/i'; + if (!preg_match($pattern, $url, $matches)) { + return $url; // 如果不是有效URL直接返回 + } + + $schemeAndHttpHost = $matches[1] ?? ''; + if (!$schemeAndHttpHost) { + return $url; + } + + // 只检查主机部分是否为本地主机 + if (str_contains($schemeAndHttpHost, '127.0.0.1') || str_contains($schemeAndHttpHost, 'localhost')) { + $baseUrl = \Cache::get('RequestContext::base_url'); + if ($baseUrl) { + return $baseUrl . substr($url, strlen($schemeAndHttpHost)); + } + } + + return $url; + } + + /** + * 清除基本URL缓存 + */ + public static function clearBaseUrlCache(): void + { + \Cache::forget('RequestContext::base_url'); + } }