默认情况下hugo以及我用的stack主题已经做到开箱即用了,同时hugo也支持各种自定义配置,我也是遇到了需求才去学习如何修过hugo配置的。
我遇到的问题是,我发现构建后的sitemap会包括所有的tags标签,以及部分着陆页,比如/tags/、/post/、/categories/等,由于我写起来文章标签定的很随意,所以我想去掉这些标签,避免被搜索引擎收录。至于各种着陆页,对于我用的主题来说在页面上并不能链接到的,也就没有存在的意义。
分类法的概念
首先需要了解hugo中分类法的概念,hugo taxonomies 与内容无关的其他四种页面类型为 robotsTXT、RSS、sitemap 和 404。
根据图中我们可以看到hugo根据内容类型进行分类,比如/tags/ /categories/属于taxonomy的类型。而像/page/ /post/属于section的类型。
禁用分类法
想要禁用这些分类页面的话,只需要在config.yaml/config.toml中配置
# 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页面使用默认的描述,标题也比较短,内容可能也不多,对于搜索引擎来说,大量短内容,无描述的页面并不是一个好现象。