Aliases
Syntax
Returns
Page 对象上的 Aliases 方法返回 aliases front matter 字段中定义的值作为服务器相对 URL,根据当前 内容维度 解析。
Aliases 方法对于生成 _redirects 文件非常有用,该文件包含每个别名的源 URL、目标 URL 和 HTTP 状态码。您可以将 _redirects 文件与 Cloudflare、GitLab Pages 和 Netlify 等托管服务一起使用。
重定向
默认情况下,Hugo 通过为每个别名路径创建单独的 HTML 文件来处理别名。这些文件包含 meta http-equiv="refresh" 标签,通过浏览器重定向访问者。
虽然功能正常,但生成单个 _redirects 文件可以让您的托管提供者在服务器级别处理重定向。这比客户端重定向更有效,并通过消除加载中间 HTML 页面的需要来提高性能。
您可以使用相同的通用方法来生成 .htaccess 文件。
示例
以下示例演示了如何配置您的站点并创建模板以自动生成 _redirects 文件。
内容结构
此多语言示例的内容结构如下:
content/
├── examples/
│ ├── a.de.md aliases = ['a-old']
│ ├── a.en.md aliases = ['a-old', 'a-older']
│ ├── b.de.md aliases = ['b-old']
│ └── b.en.md aliases = ['b-old', 'b-older']
└── _index.md在上面的示例中,别名是 页面相对 的。要指定 站点相对 路径,请在条目前加上斜杠 (/)。这两种形式都会解析为 服务器相对 路径。
页面相对路径也可以包括目录遍历:
| 路径类型 | 文件路径 | 别名 | 服务器相对路径 |
|---|---|---|---|
| 页面相对 | content/examples/a.en.md |
a-old |
/en/examples/a-old/ |
| 页面相对 | content/examples/a.en.md |
../a-old |
/en/a-old/ |
| 站点相对 | content/examples/a.en.md |
/a-old |
/en/a-old/ |
站点配置
要实现这一点,您必须更新站点配置以:
- 通过将
disableAliases设置为true来禁用默认 HTML 重定向文件的生成。 - 定义一个名为
text/redirects的 媒体类型 来处理文件格式。 - 定义一个名为
redirects的自定义 输出格式,将文件名设置为_redirects并将其放置在已发布站点的根目录。 - 配置主页 outputs 以在
html之外还包括redirects格式。
baseURL: https://example.org/
defaultContentLanguage: en
defaultContentLanguageInSubdir: true
disableAliases: true
languages:
de:
languageCode: de-DE
languageDirection: ltr
languageName: Deutsch
title: My Site in German
weight: 2
en:
languageCode: en-US
languageDirection: ltr
languageName: English
title: My Site in English
weight: 1
mediaTypes:
text/redirects:
delimiter: ''
outputFormats:
redirects:
baseName: _redirects
isPlainText: true
mediaType: text/redirects
root: true
outputs:
home:
- html
- redirects
baseURL = 'https://example.org/'
defaultContentLanguage = 'en'
defaultContentLanguageInSubdir = true
disableAliases = true
[languages]
[languages.de]
languageCode = 'de-DE'
languageDirection = 'ltr'
languageName = 'Deutsch'
title = 'My Site in German'
weight = 2
[languages.en]
languageCode = 'en-US'
languageDirection = 'ltr'
languageName = 'English'
title = 'My Site in English'
weight = 1
[mediaTypes]
[mediaTypes.'text/redirects']
delimiter = ''
[outputFormats]
[outputFormats.redirects]
baseName = '_redirects'
isPlainText = true
mediaType = 'text/redirects'
root = true
[outputs]
home = ['html', 'redirects']
{
"baseURL": "https://example.org/",
"defaultContentLanguage": "en",
"defaultContentLanguageInSubdir": true,
"disableAliases": true,
"languages": {
"de": {
"languageCode": "de-DE",
"languageDirection": "ltr",
"languageName": "Deutsch",
"title": "My Site in German",
"weight": 2
},
"en": {
"languageCode": "en-US",
"languageDirection": "ltr",
"languageName": "English",
"title": "My Site in English",
"weight": 1
}
},
"mediaTypes": {
"text/redirects": {
"delimiter": ""
}
},
"outputFormats": {
"redirects": {
"baseName": "_redirects",
"isPlainText": true,
"mediaType": "text/redirects",
"root": true
}
},
"outputs": {
"home": [
"html",
"redirects"
]
}
}
模板实现
接下来,专门为 redirects 输出格式创建一个主页模板。以下模板遍历每种语言的每个页面并提取其别名。
为确保生成的 _redirects 文件有效,模板使用 strings.FindRE 函数检查别名字符串中是否存在空格(如制表符或换行符)。如果检测到空格,Hugo 将抛出错误并使构建失败,以防止生成无效文件。
{{- if not (hugo.Store.Get "has_printed_redirects") -}}
{{- range .Sites -}}
{{- range $p := .Pages -}}
{{- range .Aliases -}}
{{- if findRE `\s` . -}}
{{- errorf "One of the front matter aliases in %q contains whitespace" $p.String -}}
{{- end -}}
{{- printf "%s %s 301\n" . $p.RelPermalink -}}
{{- end -}}
{{- end -}}
{{- end -}}
{{- hugo.Store.Set "has_printed_redirects" true -}}
{{- end -}}生成的输出
Hugo 处理模板后,会生成一个清晰的重定向规则列表。每行都遵循所需的格式:源 URL、目标 URL 和 HTTP 状态码。
生成的 _redirects 文件如下所示:
/de/examples/a-old /de/examples/a/ 301
/de/examples/b-old /de/examples/b/ 301
/en/examples/b-old /en/examples/b/ 301
/en/examples/b-older /en/examples/b/ 301
/en/examples/a-old /en/examples/a/ 301
/en/examples/a-older /en/examples/a/ 301