今天倒腾了一下午 Hugo 目录的重定向,记录一下:

问题 Link to heading

我之前的 Hugo 目录结构是这样的:

1tree -L 2 .
2├── content
3│   ├── notes
4│   ├── algorithm
5│   ├── develop
6├── themes
7│   └── hugo-coder
8└── vercel.json

按照 hugo-coder 主题文档,目录结构将会有 notes, algorithm, develop 等。

但我发现 hugo-coder 主题专门为 posts 目录做了额外的样式定义,我也想让 notes, algorithm, develop 等目录沿用类似的格式。

第一,我不想修改或覆写 hugo-coder 主题文件,后续更新主题时需要手动合并修改,太麻烦了。

第二,我不想改变最终编译出来的目录结构,这样会导致已有的链接全部失效。

探索 Link to heading

最相关的就是 how to use the same layout in a different directory 这篇文章了。

里面提出了两种方法:

  • 使用 archetype,为所有已经创建的笔记加上 layout, type 等属性。

    1---
    2type: "posts"
    3layout: "posts"
    4---
    

    这种方式出了修改现在的笔记,还要修改后续创建的所有文件,我觉得不太方便。

  • notes, algorithm, develop 移动到 posts 目录下,然后在 config.toml 中配置 permalinks

    这个方法不错,研究了半天终于搞明白了。

Permalinks 可以为 content 目录下的文件在静态编译的时候重定向到指定的目录。

举例:

1content/
2├── posts/
3│   ├── bash-in-slow-motion.md
4│   └── tls-in-a-nutshell.md
5├── tutorials/
6│   ├── git-for-beginners.md
7│   └── javascript-bundling-with-hugo.md
8└── _index.md
1[permalinks]
2  [permalinks.page]
3    posts = '/articles/:year/:month/:slug/'
4    tutorials = '/training/:slug/'
5  [permalinks.section]
6    posts = '/articles/'
7    tutorials = '/training/'

会将 posts 文件夹重定向为 article, tutorials 文件夹重定向为 training。此外,每篇文章链接前头会加上年月日。

解决 Link to heading

按照我的需求,我需要将 /posts/notes, /posts/algorithm, /posts/develop 重定向为 notes, algorithm, develop

因此我的配置是:

1[permalinks]
2  [permalinks.page]
3    posts = '/:sections[last]/:slug/'
4  [permalinks.section]
5    posts = '/:sections[last]/'