summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorNico <[email protected]>2020-06-20 15:00:25 +0200
committerBjørn Erik Pedersen <[email protected]>2020-06-20 17:13:26 +0200
commit3466884e364d0df39394742697d6fa0b37d49e64 (patch)
treefa76e1990886d69353e0ce4176fc2ebef0dec638
parent6ff435aa3f19a628f26d5ce755238e359eb77df6 (diff)
downloadhugo-3466884e364d0df39394742697d6fa0b37d49e64.tar.gz
hugo-3466884e364d0df39394742697d6fa0b37d49e64.zip
Create robots.txt in the domain root directory
Before a robots.txt is created in every Site. So in public/robots.txt if there are no languages (was correct). But if there are multiple languages in every language directory, too (was wrong). If defaultContentLanguageInSubdir is true, no language is created into the root directory, so no robots.txt is in the root directory (was wrong). If multihosts are configured for each language, that is the only case where one robots.txt must be created in each language directory (was correct). I've changed the behaviour, that only in the multihost case the robots.txt is created in the language directories. In any other case it is created in public/robots.txt. I've also added tests that files are not created in the wrong directories. Fixes #5160 See also #4193
-rw-r--r--hugolib/hugo_sites.go35
-rw-r--r--hugolib/hugo_sites_build.go5
-rw-r--r--hugolib/hugo_sites_build_test.go6
-rw-r--r--hugolib/hugo_sites_multihost_test.go7
-rw-r--r--hugolib/site.go6
-rw-r--r--hugolib/testhelpers_test.go6
6 files changed, 59 insertions, 6 deletions
diff --git a/hugolib/hugo_sites.go b/hugolib/hugo_sites.go
index e71e48d41..ee0d5c563 100644
--- a/hugolib/hugo_sites.go
+++ b/hugolib/hugo_sites.go
@@ -49,6 +49,7 @@ import (
"github.com/gohugoio/hugo/langs/i18n"
"github.com/gohugoio/hugo/resources/page"
+ "github.com/gohugoio/hugo/resources/page/pagemeta"
"github.com/gohugoio/hugo/tpl"
"github.com/gohugoio/hugo/tpl/tplimpl"
)
@@ -690,7 +691,7 @@ func (cfg *BuildCfg) shouldRender(p *pageState) bool {
return false
}
-func (h *HugoSites) renderCrossSitesArtifacts() error {
+func (h *HugoSites) renderCrossSitesSitemap() error {
if !h.multilingual.enabled() || h.IsMultihost() {
return nil
@@ -716,6 +717,38 @@ func (h *HugoSites) renderCrossSitesArtifacts() error {
s.siteCfg.sitemap.Filename, h.toSiteInfos(), templ)
}
+func (h *HugoSites) renderCrossSitesRobotsTXT() error {
+ if h.multihost {
+ return nil
+ }
+ if !h.Cfg.GetBool("enableRobotsTXT") {
+ return nil
+ }
+
+ s := h.Sites[0]
+
+ p, err := newPageStandalone(&pageMeta{
+ s: s,
+ kind: kindRobotsTXT,
+ urlPaths: pagemeta.URLPath{
+ URL: "robots.txt",
+ },
+ },
+ output.RobotsTxtFormat)
+
+ if err != nil {
+ return err
+ }
+
+ if !p.render {
+ return nil
+ }
+
+ templ := s.lookupLayouts("robots.txt", "_default/robots.txt", "_internal/_default/robots.txt")
+
+ return s.renderAndWritePage(&s.PathSpec.ProcessingStats.Pages, "Robots Txt", "robots.txt", p, templ)
+}
+
func (h *HugoSites) removePageByFilename(filename string) {
h.getContentMaps().withMaps(func(m *pageMap) error {
m.deleteBundleMatching(func(b *contentNode) bool {
diff --git a/hugolib/hugo_sites_build.go b/hugolib/hugo_sites_build.go
index f39e7a7e5..67ee10e09 100644
--- a/hugolib/hugo_sites_build.go
+++ b/hugolib/hugo_sites_build.go
@@ -334,7 +334,10 @@ func (h *HugoSites) render(config *BuildCfg) error {
}
if !config.SkipRender {
- if err := h.renderCrossSitesArtifacts(); err != nil {
+ if err := h.renderCrossSitesSitemap(); err != nil {
+ return err
+ }
+ if err := h.renderCrossSitesRobotsTXT(); err != nil {
return err
}
}
diff --git a/hugolib/hugo_sites_build_test.go b/hugolib/hugo_sites_build_test.go
index 84655c1f2..8d0872bd5 100644
--- a/hugolib/hugo_sites_build_test.go
+++ b/hugolib/hugo_sites_build_test.go
@@ -255,8 +255,10 @@ func doTestMultiSitesBuild(t *testing.T, configTemplate, configSuffix string) {
b.AssertFileContent("public/fr/404.html", "404|fr|404 Page not found")
// Check robots.txt
- b.AssertFileContent("public/en/robots.txt", "robots|en|")
- b.AssertFileContent("public/nn/robots.txt", "robots|nn|")
+ // the domain root is the public directory, so the robots.txt has to be created there and not in the language directories
+ b.AssertFileContent("public/robots.txt", "robots")
+ b.AssertFileDoesNotExist("public/en/robots.txt")
+ b.AssertFileDoesNotExist("public/nn/robots.txt")
b.AssertFileContent("public/en/sect/doc1-slug/index.html", "Permalink: http://example.com/blog/en/sect/doc1-slug/")
b.AssertFileContent("public/en/sect/doc2/index.html", "Permalink: http://example.com/blog/en/sect/doc2/")
diff --git a/hugolib/hugo_sites_multihost_test.go b/hugolib/hugo_sites_multihost_test.go
index a15e8cd43..4fe496042 100644
--- a/hugolib/hugo_sites_multihost_test.go
+++ b/hugolib/hugo_sites_multihost_test.go
@@ -19,6 +19,7 @@ disablePathToLower = true
defaultContentLanguage = "fr"
defaultContentLanguageInSubdir = false
staticDir = ["s1", "s2"]
+enableRobotsTXT = true
[permalinks]
other = "/somewhere/else/:filename"
@@ -73,6 +74,12 @@ languageName = "Nynorsk"
c.Assert(pageWithURLInFrontMatter.RelPermalink(), qt.Equals, "/docs/superbob/")
b.AssertFileContent("public/en/superbob/index.html", "doc3|Hello|en")
+ // the domain root is the language directory for each language, so the robots.txt is created in the language directories
+ b.AssertFileContent("public/en/robots.txt", "robots|en")
+ b.AssertFileContent("public/fr/robots.txt", "robots|fr")
+ b.AssertFileContent("public/nn/robots.txt", "robots|nn")
+ b.AssertFileDoesNotExist("public/robots.txt")
+
// check alias:
b.AssertFileContent("public/en/al/alias1/index.html", `content="0; url=https://example.com/docs/superbob/"`)
b.AssertFileContent("public/en/al/alias2/index.html", `content="0; url=https://example.com/docs/superbob/"`)
diff --git a/hugolib/site.go b/hugolib/site.go
index 5507d7a78..ac65931d0 100644
--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -1209,8 +1209,10 @@ func (s *Site) render(ctx *siteRenderContext) (err error) {
return
}
- if err = s.renderRobotsTXT(); err != nil {
- return
+ if ctx.multihost {
+ if err = s.renderRobotsTXT(); err != nil {
+ return
+ }
}
if err = s.render404(); err != nil {
diff --git a/hugolib/testhelpers_test.go b/hugolib/testhelpers_test.go
index c1ee27557..2af4691d1 100644
--- a/hugolib/testhelpers_test.go
+++ b/hugolib/testhelpers_test.go
@@ -726,6 +726,12 @@ func (s *sitesBuilder) AssertFileContent(filename string, matches ...string) {
}
}
+func (s *sitesBuilder) AssertFileDoesNotExist(filename string) {
+ if s.CheckExists(filename) {
+ s.Fatalf("File %q exists but must not exist.", filename)
+ }
+}
+
func (s *sitesBuilder) AssertImage(width, height int, filename string) {
filename = filepath.Join(s.workingDir, filename)
f, err := s.Fs.Destination.Open(filename)