From 6024a2e8035ef0b78262db83d8d41476abf91fae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89mile=20R=C3=A9?= Date: Tue, 21 Jul 2026 19:08:55 +0200 Subject: [PATCH] Omit SEO links for relative base URLs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit portalOrigin fell back to the raw input when scheme or host was missing, so paths like /fr/documents still produced canonical and hreflang tags. Return an empty origin instead. Signed-off-by: Émile Ré --- pkg/server/api/complianceportal/v1/seo.go | 3 ++- .../api/complianceportal/v1/seo_test.go | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/pkg/server/api/complianceportal/v1/seo.go b/pkg/server/api/complianceportal/v1/seo.go index eabc41d6f..cd709b2c5 100644 --- a/pkg/server/api/complianceportal/v1/seo.go +++ b/pkg/server/api/complianceportal/v1/seo.go @@ -76,10 +76,11 @@ func SEOFromRequest(r *http.Request, pageBaseURL string) (htmlLang, canonical st // portalOrigin returns scheme://host from pageBaseURL, dropping any path, // query, or fragment. Callers may pass a full request URL by mistake. +// Relative or malformed values yield "" so SEO links are omitted. func portalOrigin(pageBaseURL string) string { parsed, err := url.Parse(pageBaseURL) if err != nil || parsed.Scheme == "" || parsed.Host == "" { - return strings.TrimRight(pageBaseURL, "/") + return "" } return (&url.URL{Scheme: parsed.Scheme, Host: parsed.Host}).String() diff --git a/pkg/server/api/complianceportal/v1/seo_test.go b/pkg/server/api/complianceportal/v1/seo_test.go index 06b203fa1..1d9d6163b 100644 --- a/pkg/server/api/complianceportal/v1/seo_test.go +++ b/pkg/server/api/complianceportal/v1/seo_test.go @@ -124,3 +124,22 @@ func TestSEOFromRequest_EmptyBaseURLOmitsLinks(t *testing.T) { assert.Empty(t, canonical) assert.Nil(t, hreflang) } + +func TestSEOFromRequest_RelativeBaseURLOmitsLinks(t *testing.T) { + t.Parallel() + + req, err := http.NewRequest( + http.MethodGet, + "https://trust.acme.com/fr/documents", + nil, + ) + require.NoError(t, err) + + lang, canonical, hreflang := complianceportal_v1.SEOFromRequest( + req, + "/fr/documents", + ) + assert.Equal(t, "fr", lang) + assert.Empty(t, canonical) + assert.Nil(t, hreflang) +}