Featured image of post 更改Hugo博客的永久URL链接,并用Netlify实现旧博文跳转

更改Hugo博客的永久URL链接,并用Netlify实现旧博文跳转

告别找不到博文链接的404

目录

对于静态博客,有时候会需要更改博文的永久URL链接格式,比如把格式为/blog/xxx的链接改为/post/xxx。有时由于迁移博客,也需要把以前的老博文进行URL重定向跳转,以避免失效链接导致的404。

我以前的博文链接格式是/post/xxx ,每次在社交媒体分享链接的时候都觉得post实在有点多余,想简化一下。所以在本文里,我的目的是让所有格式为https://thirdshire.com/post/xxx 的链接都去掉post,并自动跳转到https://thirdshire.com/xxx/ 。其中跳转规则的设置通过Netlify实现,有两种方法(当然这么做的前提是已经用Netlify部署博客了)。

更新Hugo永久URL链接

以我使用的Hugo博客为例,每个markdown文件的都含有YAML front matter,通过YAML里的slug来定义永久URL,如slug: march-2023-recap

更改Hugo的永久URL链接很简单。对于我使用的Hugo Stack主题,在/config/_default/permalinks.toml里更改即可。Stack主题的博文默认URL格式是post = "post/:slug/",将其改成:

post = "/:slug/"

如果是只有一个config.toml文件,也可以直接在里面更改:

[permalinks]
  post = "/:slug/"

用Netlify实现链接跳转

方法一:在Netlify配置文件内增加重定向规则

更改Netlify配置文件

在博客的根目录文件夹里的netlify.toml文件添加如下代码,如果没有就新建一个。这部分代码即为设置Netlify的重定向规则,它做的事情就是将所有格式为/post/xxx的链接跳转到/xxx。更详细的规则和设置可参见redirects options部分的官方文档

[[redirects]]
from = "/post/*"
to = "/:splat"

有很多老博客都会用包含日期的URL链接如yyyy/mm/dd/my-post,如果迁移到了不含日期的URL,可以在netlify.toml里添加如下跳转规则:

[[redirects]]
from = "/:year/:month/:date/:slug"
to = "/:slug"

方法二:通过创建_redirects文件来添加重定向规则

第二种方法是创建一个重定向文件_redirects(无任何后缀名),里面含有具体需要跳转的新URL和旧URL。_redirects必须放在博客的publish文件夹(通常默认是/public)。关于这部分重定向的规则也可参阅有关官方文档

_redirects的内容格式如下,其中空格前面是旧链接,空格后面是新链接。

/post/my-post /my-post
/post/my-post-2 /my-post-2

用Python自动生成Netlify重定向URL文件

如果博文很少的话可以手动创建,但我是个懒人(),就在ChatGPT的帮助下快速写了(抄了)一个Python script,它的主要目的是:

  1. 在/content/post这个博文文件夹内查找子文件夹内的所有md文件
  2. 在每个md文件中搜索并提取出格式为slug: xxx中的内容,即博文的URL,并将提取出的URL放在名为slug_list的list内
  3. 根据上文提到的格式创建_redirects文件
点我展开Python script
import re
from pathlib import Path

main_folder_path = "/content/post"

def list_md_files(path):
    return [file for file in Path(path).rglob("*.md")]

md_files = list_md_files(main_folder_path)
print(md_files)

slug_list = []

for file_path in md_files:
    with open(file_path, 'r', encoding='utf-8') as file:
        file_content = file.read()

    match = re.search(r"^slug: (.+)", file_content, re.MULTILINE)
    
    if match:
        slug_value = match.group(1).strip()
        slug_list.append(slug_value)

print(slug_list)

redirects = [f"/post/{slug} /{slug}" for slug in slug_list]
print(redirects)

with open("_redirects", "w", encoding="utf-8") as redirect_file:
    redirect_file.write("\n".join(redirects))

变量可按需更改。运行完后打开博客根目录,确保_redirects已经放在里面就可以了。

_redirects文件放在发布文件夹

这部分取决于部署方式的不同,方法也不一样,最终目的都是让_redirects文件放在发布文件夹(一般默认为/public)。

以我的Stack主题为例,还是在博客根目录文件夹里的netlify.toml文件里添加如下代码。 mv _redirects public这个命令做的其实就是把_redirects文件在hugo build完成后放入public文件夹。

[build]
 publish = "public"
 command = "hugo --gc --minify && mv _redirects public"

如果不用netlify.toml而是用Netlify官网的build command部署,也可以在build command后面加上如上的代码,效果是一样的。

完成后测试一下旧链接,现在应该能跳转到新页面并在浏览器地址栏显示更新后的链接地址了。

本博客已稳定运行
发表了32篇文章 · 总计87.77k字
·
使用 Hugo 构建 · Deployed on Netlify
主题 StackJimmy 设计