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