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); + } +}