Nginx Rewrite 轉舊網址

Nginx Rewrite 轉舊網址

最近看了一篇如何提升Hexo SEO的文章,就跟著做了一次
其中就將既有的文章網址由 yyyy/mm/dd/title 改為 /title
導致被Google收錄的Cache網址都變成了 404 Not Found

Nginx 與 Apache 處理方式不同
Apache 可以直接將 .htaccess放置在public/中

(.*) 可以變成參數,透過$1, $2, $3… 放置到後面轉址的連結中
rewrite第三個參數 有幾種選項可以選

1
2
3
4
location / {
try_files $uri $uri/ =404;
rewrite ^/(.*)/(.*)/(.*)/(.*)/ /$4/ redirect;
}
參數 說明
permanent 301 轉址
redirect 302 轉址
break 只會執行第一個 rewrite
last 只會執行第一個 rewrite,且會根據新的 rewrite 找尋新吻合的 location

break 與 last 都只會執行第一個rewrite,之後的將都不會處理

下方參考文章中的 解釋 break 與 last 差異 網站程式碼內容範例複製比較清楚

  • Example 4: Inside location block - “last”

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    server {
    server_name example.com;
    root 'path/to/somewhere';

    location / {
    echo 'finally matched location /';
    rewrite ^/([^/]+.txt)$ /notes/$1 last;
    rewrite ^/notes/([^/]+.txt)$ /documents/$1; # this is not parsed
    }

    location /notes {
    echo 'finally matched location /notes';
    rewrite ^/notes/([^/]+.txt)$ /documents/$1; # this is not parsed, either!
    }

    location /documents {
    echo 'finally matched location /documents';
    }
    }
  • last 結果

    1
    2
    # curl example.com/test.txt
    finally matched location /notes
  • Example 3: Inside location block - “break”

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    server {
    server_name example.com;
    root 'path/to/somewhere';

    location / {
    echo 'finally matched location /';
    rewrite ^/([^/]+.txt)$ /notes/$1 break;
    rewrite ^/notes/([^/]+.txt)$ /documents/$1; # this is not parsed
    }

    location /notes {
    echo 'finally matched location /notes';
    }

    location /documents {
    echo 'finally matched location /documents';
    }
    }
  • break 結果

    1
    2
    # curl example.com/test.txt
    finally matched location /

參考文章: