diff --git a/src/Facades/Endpoint/URL.php b/src/Facades/Endpoint/URL.php index 86f9affeefe..4eb7182c91c 100644 --- a/src/Facades/Endpoint/URL.php +++ b/src/Facades/Endpoint/URL.php @@ -174,6 +174,9 @@ public function removeSiteUrl(?string $url): string */ public function makeRelative(?string $url): string { + // Normalize duplicate leading slashes before parsing to avoid protocol-relative URL interpretation. + $url = preg_replace('#^/+#', '/', (string) $url); + $parsed = parse_url($url); $url = $parsed['path'] ?? '/'; diff --git a/tests/Facades/UrlTest.php b/tests/Facades/UrlTest.php index 21dcee85b5d..8986f593271 100644 --- a/tests/Facades/UrlTest.php +++ b/tests/Facades/UrlTest.php @@ -642,6 +642,8 @@ public static function relativeProvider() 'already relative nested route without trailing slash' => ['/foo/page', '/foo/page'], 'already relative nested route with trailing slash' => ['/foo/page/', '/foo/page'], 'already relative nested route without leading slash' => ['foo/page', '/foo/page'], + 'duplicate leading slashes' => ['//page', '/page'], + 'multiple duplicate leading slashes' => ['////page', '/page'], 'homepage without trailing slash and query param' => ['http://example.com?bar=baz', '/?bar=baz'], 'homepage with trailing slash and query param' => ['http://example.com/?bar=baz', '/?bar=baz'],