From 77aef4e59b59ea8f466e9893fd2b50af9d10ac8f Mon Sep 17 00:00:00 2001 From: Duncan McClean Date: Mon, 24 Aug 2026 12:20:22 +0100 Subject: [PATCH] use resolved site urls when determining external urls Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01RxbUD3x2pWcJerdNBoCK1E --- src/Facades/Endpoint/URL.php | 4 ++-- tests/Facades/UrlTest.php | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/Facades/Endpoint/URL.php b/src/Facades/Endpoint/URL.php index 8bc6e8f0b75..e4e41d3eca9 100644 --- a/src/Facades/Endpoint/URL.php +++ b/src/Facades/Endpoint/URL.php @@ -438,11 +438,11 @@ private function ensureSiteCaches(): void $sites = Site::all(); self::$hasRelativeSiteCache = $sites->contains( - fn ($site) => Str::startsWith((string) ($site->rawConfig()['url'] ?? ''), '/') + fn ($site) => Str::startsWith((string) $site->url(), '/') ); self::$absoluteSiteUrlsCache = $sites - ->map(fn ($site) => $site->rawConfig()['url'] ?? null) + ->map(fn ($site) => $site->url()) ->filter(fn ($siteUrl) => self::isAbsolute($siteUrl)) ->map(fn ($siteUrl) => self::getDomainFromAbsolute($siteUrl)); diff --git a/tests/Facades/UrlTest.php b/tests/Facades/UrlTest.php index 5ec9e778100..e222e22dff7 100644 --- a/tests/Facades/UrlTest.php +++ b/tests/Facades/UrlTest.php @@ -314,6 +314,41 @@ public function it_does_not_trust_current_request_domain_when_no_sites_are_relat $this->assertFalse(URL::isExternalToApplication('http://this-site.com/')); } + #[Test] + public function it_determines_external_url_to_application_when_site_urls_are_configured_with_antlers() + { + config(['app.frontend_url' => 'http://frontend-site.com']); + + $this->setSites([ + 'en' => ['name' => 'English', 'locale' => 'en_US', 'url' => '{{ config:app:frontend_url }}'], + 'fr' => ['name' => 'French', 'locale' => 'fr_FR', 'url' => '{{ config:app:frontend_url }}/fr'], + ]); + + $this->assertFalse(URL::isExternalToApplication('http://frontend-site.com/')); + $this->assertFalse(URL::isExternalToApplication('http://frontend-site.com/fr/')); + $this->assertTrue(URL::isExternalToApplication('http://external-site.com/')); + } + + #[Test] + public function it_tidies_urls_on_site_hosts_configured_with_antlers() + { + config(['app.frontend_url' => 'http://frontend-site.com']); + + $this->setSites([ + 'en' => ['name' => 'English', 'locale' => 'en_US', 'url' => '{{ config:app:frontend_url }}'], + 'fr' => ['name' => 'French', 'locale' => 'fr_FR', 'url' => '{{ config:app:frontend_url }}/fr'], + ]); + + $this->assertSame('http://frontend-site.com', URL::tidy('http://frontend-site.com/')); + $this->assertSame('http://frontend-site.com/fr', URL::tidy('http://frontend-site.com/fr/')); + $this->assertSame('http://external-site.com/page/', URL::tidy('http://external-site.com/page/')); + + URL::enforceTrailingSlashes(); + + $this->assertSame('http://frontend-site.com/fr/', URL::tidy('http://frontend-site.com/fr')); + $this->assertSame('http://external-site.com/page', URL::tidy('http://external-site.com/page')); + } + #[Test] #[DataProvider('assembleProvider')] public function it_can_assemble_urls($segments, $assembled)