默认情况下 Hugo 以及我用的 Stack 主题已经做到开箱即用了,同时 Hugo 也支持各种自定义配置,我也是遇到了需求才去学习如何修过 Hugo 配置的。
我遇到的问题是,我发现构建后的 sitemap.xml 会包括所有的tags标签,以及部分着陆页,比如 tags、post、categories 等,由于我写起来文章标签定的很随意,所以我想去掉这些标签,避免被搜索引擎收录。至于各种着陆页,对于我用的主题来说在页面上并不能链接到的,也就没有存在的意义。
分类法的概念
首先需要了解 Hugo 分类法 的概念,与内容无关的其他四种页面类型为 robotsTXT、RSS、sitemap 和 404

根据图中我们可以看到 Hugo 根据内容类型进行分类,比如 tags categories 属于 taxonomy 的类型,而像 page post 属于 section 的类型。
禁用分类法
想要禁用这些分类页面的话,只需要在 config.yaml 中配置
# config.yaml
disableKinds: ["taxonomy", "section"]
重新构建后,我们再次访问 /tags/ /post/ 等页面,发现已经无法访问了,当然其他正常页面不会受到影响。同理你也可以禁用404页面、sitemap、robots.txt等页面。
自定义sitemap
禁用分类法之后,那些页面也不会出现在 sitemap.xml 中。但是 tags/xxx/index.html 还是会出现在sitemap中,是因为我们没有关闭term分类,毕竟Stack主题默认显示标签云,关闭了标题功能直接没了。
但是我想要实现的是把这些标签页面剔除sitemap中,不需要被搜索引擎收录。实现这个也很简单,创建 layout/_default/sitemap.xml ,配置如下:
{{ printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>" | safeHTML }}
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xhtml="http://www.w3.org/1999/xhtml">{{ range .Data.Pages }}{{ if not (strings.Contains .RelPermalink "/tags") }}
<url>
<loc>{{ .Permalink }}</loc>{{ if not .Lastmod.IsZero }}
<lastmod>{{ safeHTML ( .Lastmod.Format "2006-01-02T15:04:05-07:00" ) }}</lastmod>{{ end }}{{ with .Sitemap.ChangeFreq }}
<changefreq>{{ . }}</changefreq>{{ end }}{{ if ge .Sitemap.Priority 0.0 }}
<priority>{{ .Sitemap.Priority }}</priority>{{ end }}{{ if .IsTranslated }}{{ range .Translations }}
<xhtml:link
rel="alternate"
hreflang="{{ .Language.Lang }}"
href="{{ .Permalink }}"
/>{{ end }}
<xhtml:link
rel="alternate"
hreflang="{{ .Language.Lang }}"
href="{{ .Permalink }}"
/>{{ end }}
</url>{{ end }}{{ end }}
</urlset>
相比默认的sitemap配置,我们只加了一行代码。就是包含tags的链接不被引入sitemap
{{ if not (strings.Contains .RelPermalink "/tags") }}
熟悉hugo的同学应该知道hugo很多配置是通过覆盖默认配置来实现的,通过修改 layout/assets 目录下的一些代码文件就可以实现自定义 head/css/sitemap
配置robots.txt
虽然sitemap中的tags链接已经被我们排除了sitemap,但还是有可能被搜索引擎收录到,所以我们需要配置 static/robots.txt
User-agent: *
Disallow: /tags/
自定义tags页面
如果tags对你来说很重要,需要被搜索引擎收录,或者需要添加描述,那么可以自定义tags页面的标题和描述。新建 content/tags/yourtag/_index.html ,跟分类的配置几乎一样
title: 标签
description: 标签描述
大功告成
至此我们已经实现了最初的全部需求,删除了不必要的页面,去除了sitemap中的tags页面,并且禁止了搜索引擎收录。那么为什么要删除这些页面呢?因为默认生成的tags页面使用默认的描述,标题也比较短,内容可能也不多,对于搜索引擎来说,大量短内容,无描述的页面并不是一个好现象。