HUGO
Menu
GitHub 87548 stars Mastodon

Aliases

返回 front matter 中定義的別名作為服務器相對 URL,根據當前內容維度解析。

Syntax

PAGE.Aliases

Returns

[]string

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/

站點配置

要實現這一點,您必須更新站點配置以:

  1. 通過將 disableAliases 設置為 true 來禁用默認 HTML 重定向文件的生成。
  2. 定義一個名為 text/redirects媒體類型 來處理文件格式。
  3. 定義一個名為 redirects 的自定義 輸出格式,將文件名設置為 _redirects 並將其放置在已發布站點的根目錄。
  4. 配置主頁 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 將拋出錯誤並使構建失敗,以防止生成無效文件。

layouts/home.redirects
{{- 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

Last updated: January 1, 0001
Improve this page