在 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 頁面重定向規則,你無須做額外配置。