hugolib: Don't render default site redirect for non-primary isHTML output formats

When a custom output format has isHTML=true but no Path, renderDefaultSiteRedirect
would derive intermediate redirect paths from homeLink (e.g. /en/foo.html),
creating a spurious redirect at /en/ that overwrites the actual HTML content.

Only render the default site redirect for the canonical "html" format
or for formats with their own Path prefix (e.g. AMP).

Fixes #14482

Co-Authored-By: Joe Mooring <joe.mooring@veriphor.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Bjørn Erik Pedersen
2026-02-08 16:20:24 +01:00
parent 24eb84f868
commit 6ac7d081d1
2 changed files with 67 additions and 1 deletions
+66
View File
@@ -683,3 +683,69 @@ Home.
"/guest/v1.0.0/en/p3 =>/guest/v1.0.0/en/foo/p1/|",
)
}
// Issue 14482
func TestOutputFormatIsHTMLWithMultilangAliases(t *testing.T) {
t.Parallel()
files := `
-- hugo.toml --
defaultContentLanguageInSubdir = true
disableKinds = ['page', 'section', 'rss', 'sitemap', 'taxonomy', 'term']
[languages.en]
[languages.de]
[outputFormats.foo]
baseName = 'foo'
isHTML = false
mediaType = 'text/html'
[outputs]
home = ['html', 'foo']
-- content/index.de.md --
---
title: home de
---
-- content/index.en.md --
---
title: home en
---
-- layouts/home.html --
Output format: html|Title: {{ .Title }}
-- layouts/home.foo.html --
Output format: foo|Title: {{ .Title }}
`
b := Test(t, files)
b.AssertFileContent("public/en/index.html", `Output format: html|Title: home en`)
b.AssertFileContent("public/en/foo.html", `Output format: foo|Title: home en`)
b.AssertFileContent("public/de/index.html", `Output format: html|Title: home de`)
b.AssertFileContent("public/de/foo.html", `Output format: foo|Title: home de`)
b.AssertFileContent("public/index.html", `
<head>
<title>/en/</title>
<link rel="canonical" href="/en/">
<meta charset="utf-8">
<meta http-equiv="refresh" content="0; url=/en/">
</head>
`)
files = strings.ReplaceAll(files, "isHTML = false", "isHTML = true")
b = Test(t, files)
b.AssertFileContent("public/en/index.html", `Output format: html|Title: home en`)
b.AssertFileContent("public/en/foo.html", `Output format: foo|Title: home en`)
b.AssertFileContent("public/de/index.html", `Output format: html|Title: home de`)
b.AssertFileContent("public/de/foo.html", `Output format: foo|Title: home de`)
b.AssertFileContent("public/index.html", `
<head>
<title>/en/</title>
<link rel="canonical" href="/en/">
<meta charset="utf-8">
<meta http-equiv="refresh" content="0; url=/en/">
</head>
`)
}
+1 -1
View File
@@ -217,7 +217,7 @@ func pageRenderer(
}
}
if p.IsHome() && p.outputFormat().IsHTML && s.isDefault() {
if of := p.outputFormat(); p.IsHome() && of.IsHTML && s.isDefault() && (of.Path != "" || of.Name == "html") {
if err = s.renderDefaultSiteRedirect(p); err != nil {
if sendErr(err) {
continue