<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>重定向 on KnightLi的博客</title>
        <link>https://www.knightli.com/tags/%E9%87%8D%E5%AE%9A%E5%90%91/</link>
        <description>Recent content in 重定向 on KnightLi的博客</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Sun, 17 May 2026 20:00:17 +0800</lastBuildDate><atom:link href="https://www.knightli.com/tags/%E9%87%8D%E5%AE%9A%E5%90%91/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Hugo aliases 怎么用？旧 URL 自动跳转与 404 修复指南</title>
        <link>https://www.knightli.com/2026/05/17/hugo-aliases-url-redirect/</link>
        <pubDate>Sun, 17 May 2026 20:00:17 +0800</pubDate>
        
        <guid>https://www.knightli.com/2026/05/17/hugo-aliases-url-redirect/</guid>
        <description>&lt;p&gt;Hugo 的 &lt;code&gt;aliases&lt;/code&gt; 用来给页面创建旧 URL 跳转。&lt;/p&gt;
&lt;p&gt;当你修改文章链接、合并页面、迁移博客，或者想修复某个常见的错误 URL 时，可以在文章的 Front Matter 里添加 &lt;code&gt;aliases&lt;/code&gt;。Hugo 会为这些旧地址生成跳转页面，把访问者带到当前文章的新地址，避免旧链接直接变成 404。&lt;/p&gt;
&lt;h2 id=&#34;aliases-适合解决什么问题&#34;&gt;aliases 适合解决什么问题
&lt;/h2&gt;&lt;p&gt;最常见的场景有三类。&lt;/p&gt;
&lt;p&gt;第一类是优化文章链接。&lt;/p&gt;
&lt;p&gt;例如，你原来的文章地址是：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/posts/tech/2023-01-01-hello/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;后来想改成更短的地址：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/hello/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这时可以给新文章加上旧地址 alias。这样搜索引擎、外部引用、社交平台旧链接仍然能访问到内容。&lt;/p&gt;
&lt;p&gt;第二类是合并或迁移页面。&lt;/p&gt;
&lt;p&gt;如果你把几篇旧文章合并到一篇新文章，或者从 Hexo、Typecho、WordPress 等平台迁移到 Hugo，旧平台的 URL 结构往往和新站不同。&lt;code&gt;aliases&lt;/code&gt; 可以把这些旧地址逐个指向新页面，降低迁移后的 404 数量。&lt;/p&gt;
&lt;p&gt;第三类是处理拼写错误。&lt;/p&gt;
&lt;p&gt;有些 URL 可能曾经写错，或者外部网站已经引用了错误路径。如果这个错误链接有访问量，可以为它单独设置 alias，让用户仍然能跳到正确页面。&lt;/p&gt;
&lt;h2 id=&#34;基本写法&#34;&gt;基本写法
&lt;/h2&gt;&lt;p&gt;只需要在文章 Front Matter 中添加 &lt;code&gt;aliases&lt;/code&gt; 字段。&lt;/p&gt;
&lt;p&gt;下面是 YAML 格式示例：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nn&#34;&gt;---&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;新文章标题&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;date&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;ld&#34;&gt;2026-05-17T12:00:00&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;+09&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;00&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;/new-path/my-new-article/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;aliases&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;/old-path/old-article/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;../old-version/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nn&#34;&gt;---&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这里的 &lt;code&gt;/old-path/old-article/&lt;/code&gt; 是站点相对路径。&lt;code&gt;../old-version/&lt;/code&gt; 则是相对当前页面的路径。&lt;/p&gt;
&lt;p&gt;实际使用时，更推荐优先使用站点相对路径，也就是以 &lt;code&gt;/&lt;/code&gt; 开头的路径。它更直观，也更不容易因为文章目录结构变化而产生误判。&lt;/p&gt;
&lt;h2 id=&#34;和-url-字段的关系&#34;&gt;和 url 字段的关系
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;url&lt;/code&gt; 决定当前页面的新地址。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;aliases&lt;/code&gt; 决定哪些旧地址会跳转到这个新地址。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;/new-path/my-new-article/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;aliases&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;/old-path/old-article/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;构建后，用户访问 &lt;code&gt;/old-path/old-article/&lt;/code&gt;，会被跳转到 &lt;code&gt;/new-path/my-new-article/&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;如果文章没有显式设置 &lt;code&gt;url&lt;/code&gt;，Hugo 会按照站点的 &lt;code&gt;permalinks&lt;/code&gt; 配置、文章日期、slug 等规则生成当前页面地址。&lt;code&gt;aliases&lt;/code&gt; 仍然会指向这个最终生成的页面。&lt;/p&gt;
&lt;h2 id=&#34;hugo-默认怎么实现跳转&#34;&gt;Hugo 默认怎么实现跳转
&lt;/h2&gt;&lt;p&gt;默认情况下，Hugo 会为每个 alias 生成一个独立的 HTML 文件。&lt;/p&gt;
&lt;p&gt;这个 HTML 文件通常会使用：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;meta&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;http-equiv&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;refresh&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;让浏览器打开旧地址后自动跳转到新地址。&lt;/p&gt;
&lt;p&gt;这种方式简单、跨平台，适合普通静态托管环境。但它本质上是浏览器端跳转，不是服务端返回的 301 / 302 重定向。&lt;/p&gt;
&lt;p&gt;对小站点来说，这通常已经够用。只要旧地址能打开，并且最终能到达新文章，就可以避免明显的 404 问题。&lt;/p&gt;
&lt;h2 id=&#34;什么时候考虑服务端重定向&#34;&gt;什么时候考虑服务端重定向
&lt;/h2&gt;&lt;p&gt;如果站点部署在 Netlify、Cloudflare Pages、Vercel 或其他支持重定向规则的平台上，可以考虑用服务端重定向。&lt;/p&gt;
&lt;p&gt;服务端重定向的优势是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;响应更直接，不需要先返回一个 HTML 跳转页。&lt;/li&gt;
&lt;li&gt;更容易明确使用 301 或 302 状态码。&lt;/li&gt;
&lt;li&gt;对大量迁移规则更集中，方便审计和维护。&lt;/li&gt;
&lt;li&gt;对 SEO 迁移更可控。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一种常见做法是禁用 Hugo 默认 alias 页面生成，再输出平台需要的重定向规则文件。例如 Netlify 常用 &lt;code&gt;_redirects&lt;/code&gt;，Cloudflare Pages 可以使用 &lt;code&gt;_redirects&lt;/code&gt; 或平台自己的规则配置。&lt;/p&gt;
&lt;p&gt;如果你走这条路线，需要在 Hugo 配置中研究 &lt;code&gt;disableAliases&lt;/code&gt; 和自定义 output format。不要只删掉 &lt;code&gt;aliases&lt;/code&gt;，否则旧链接会直接变成 404。&lt;/p&gt;
&lt;h2 id=&#34;使用-aliases-的注意事项&#34;&gt;使用 aliases 的注意事项
&lt;/h2&gt;&lt;p&gt;第一，不要把 &lt;code&gt;aliases&lt;/code&gt; 当成随意改 URL 的借口。&lt;/p&gt;
&lt;p&gt;URL 一旦公开，就会进入搜索引擎、RSS、社交平台、书签和外部引用。频繁修改 URL 会制造维护成本。&lt;code&gt;aliases&lt;/code&gt; 更适合修复历史问题，而不是鼓励经常改路径。&lt;/p&gt;
&lt;p&gt;第二，避免 alias 互相循环。&lt;/p&gt;
&lt;p&gt;旧地址应该指向当前文章的新地址，不要让 A 跳 B、B 又跳 A，也不要让多个页面争用同一个 alias。&lt;/p&gt;
&lt;p&gt;第三，多语言站点要注意语言前缀。&lt;/p&gt;
&lt;p&gt;Hugo 多语言站点通常会自动处理语言路径。如果你在某个语言版本里写 alias，有时不需要手动加 &lt;code&gt;/en/&lt;/code&gt;、&lt;code&gt;/zh-tw/&lt;/code&gt; 这类前缀。否则可能生成重复路径，例如 &lt;code&gt;/en/en/...&lt;/code&gt;。具体行为要以本地构建结果为准。&lt;/p&gt;
&lt;p&gt;第四，修改后要检查生成目录。&lt;/p&gt;
&lt;p&gt;添加 alias 后，可以构建一次站点，再检查 &lt;code&gt;public&lt;/code&gt; 目录里是否生成了旧路径对应的 &lt;code&gt;index.html&lt;/code&gt;，并确认其中的目标链接是否正确。&lt;/p&gt;
&lt;h2 id=&#34;一个实用检查流程&#34;&gt;一个实用检查流程
&lt;/h2&gt;&lt;p&gt;修改文章 Front Matter 后，可以按下面流程检查：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;确认当前文章的新 URL。&lt;/li&gt;
&lt;li&gt;在 &lt;code&gt;aliases&lt;/code&gt; 中写入旧 URL。&lt;/li&gt;
&lt;li&gt;运行 Hugo 构建。&lt;/li&gt;
&lt;li&gt;到 &lt;code&gt;public&lt;/code&gt; 目录检查旧 URL 对应的 &lt;code&gt;index.html&lt;/code&gt; 是否生成。&lt;/li&gt;
&lt;li&gt;打开生成的 HTML，确认跳转目标是否是新 URL。&lt;/li&gt;
&lt;li&gt;如果是多语言页面，特别检查是否出现重复语言前缀。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这样可以在部署前发现大部分路径问题。&lt;/p&gt;
&lt;h2 id=&#34;小结&#34;&gt;小结
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;aliases&lt;/code&gt; 是 Hugo 里处理旧链接的轻量工具。&lt;/p&gt;
&lt;p&gt;它最适合用在文章改 URL、博客迁移、页面合并和错误路径修复这些场景。普通静态站点可以直接使用 Hugo 默认生成的 HTML 跳转页；如果站点规模较大，或对 SEO 迁移要求更高，可以进一步改成服务端重定向规则。&lt;/p&gt;
&lt;p&gt;真正关键的是：不要只关注新链接是否好看，也要照顾已经存在的旧链接。一个能把旧 URL 平稳带到新页面的站点，才不容易在迁移和改版时丢掉历史流量。&lt;/p&gt;
&lt;h2 id=&#34;参考资料&#34;&gt;参考资料
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://gohugo.io/content-management/urls/#aliases&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Hugo Documentation: Aliases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://gohugo.io/content-management/urls/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Hugo Documentation: URL management&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        
    </channel>
</rss>
