From ffc88feede59a2249b8e0220a6dc1e762a9e7a80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=90=9D=E5=8D=9C?= Date: Sat, 14 Mar 2026 21:51:17 +0000 Subject: [PATCH] fix(backurl): avoid double fragment in withBackFirstAndFragment --- app/Support/BackUrl.php | 5 +++++ ...dFragmentOverridesExistingFragmentTest.php | 20 +++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 tests/Unit/BackUrlWithBackFirstAndFragmentOverridesExistingFragmentTest.php diff --git a/app/Support/BackUrl.php b/app/Support/BackUrl.php index 1b8817b..706a58e 100644 --- a/app/Support/BackUrl.php +++ b/app/Support/BackUrl.php @@ -176,6 +176,11 @@ class BackUrl */ public static function withBackFirstAndFragment(string $path, string $safeBackForLinks = '', string $fragment = ''): string { + // 若调用方传入了 path 自带 fragment,同时又传入 fragment 参数,避免出现 "#old#new"。 + if ((string) $fragment !== '' && str_contains((string) $path, '#')) { + [$path] = explode('#', (string) $path, 2); + } + $url = self::withBackFirst($path, $safeBackForLinks); $fragment = ltrim((string) $fragment, '#'); diff --git a/tests/Unit/BackUrlWithBackFirstAndFragmentOverridesExistingFragmentTest.php b/tests/Unit/BackUrlWithBackFirstAndFragmentOverridesExistingFragmentTest.php new file mode 100644 index 0000000..8eb8ab5 --- /dev/null +++ b/tests/Unit/BackUrlWithBackFirstAndFragmentOverridesExistingFragmentTest.php @@ -0,0 +1,20 @@ + $back]); + + $url = BackUrl::withBackFirstAndFragment('/admin/site-subscriptions/2#old', $back, 'new'); + + $this->assertSame('/admin/site-subscriptions/2?' . $backQuery . '#new', $url); + } +}