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