diff --git a/app/Support/BackUrl.php b/app/Support/BackUrl.php index 49eea00..1b8817b 100644 --- a/app/Support/BackUrl.php +++ b/app/Support/BackUrl.php @@ -152,6 +152,11 @@ class BackUrl */ public static function withBackAndFragment(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::withBack($path, $safeBackForLinks); $fragment = ltrim((string) $fragment, '#'); diff --git a/tests/Unit/BackUrlWithBackAndFragmentOverridesExistingFragmentTest.php b/tests/Unit/BackUrlWithBackAndFragmentOverridesExistingFragmentTest.php new file mode 100644 index 0000000..f0916eb --- /dev/null +++ b/tests/Unit/BackUrlWithBackAndFragmentOverridesExistingFragmentTest.php @@ -0,0 +1,20 @@ + $back]); + + $url = BackUrl::withBackAndFragment('/admin/site-subscriptions/2#old', $back, 'new'); + + $this->assertSame('/admin/site-subscriptions/2?' . $backQuery . '#new', $url); + } +}