在 Hugo 多语言站点中,一般需要为 404 页面设置额外的重定向规则。
问题
在多语言站点中,有几个情况,假设 en
为默认语言。
语言 | defaultContentLanguageInSubdir | 404 页面 |
---|---|---|
en | false | /404.html |
en | true | /en/404.html |
zh-hans | true | /zh-hans/404.html |
zh-hant | true | /zh-hant/404.html |
可以看到 404 页面也是多语言化的,我的目标方案是根据首个路径匹配语言,尝试查找 404 页面,匹配失败则使用默认语言的 404 页面。
Nginx
1server {
2 location ~* ^/([^/]+) {
3 index index.html index.htm;
4 error_page 404 = @error;
5 }
6
7 error_page 404 /404.html;
8 location @error {
9 try_files /$1/404.html /404.html =404;
10 }
11}
- 这里先定义了一个
@error
块,利用try_files
于第一个路径下尝试匹配404.html
,失败则使用默认的 404 页面。 - 如果你开启了
defaultContentLanguageInSubdir
,在站点构建时,还需要将默认的 404 页面复制到根目录。
也许还可以根据请求头,以获取用户偏好的语言进行更准确的语言匹配,由于笔者经验有限,只能后续有空再研究研究。
Netlify
1[[redirects]]
2 from = "/:lang/*"
3 to = "/:lang/404.html"
4 status = 404
5
6[[redirects]]
7 from = "/*"
8 to = "/en/404.html" # Replace the "en" to your default language code.
9 # to = "/404.html" # Use it when a monolingual site or "defaultContentLanguageInSubdir" is disabled.
10 status = 404
Cloudflare Pages
Cloudflare Pages 已经为你设置好 404 页面重定向规则,你无须做额外配置。