1. 程式人生 > >Nginx高階之Rewrite規則

Nginx高階之Rewrite規則

進階階段的回顧:

Nginx進階之靜態Web資源服務

Nginx進階之代理服務

Nginx進階之負載均衡服務

Nginx進階之快取服務和動靜分離   

作用及應用場景

作用: 實現對URL的重寫以及對匹配(正則表示式)的url的重定向

場景: 

1. URL訪問跳轉, 支援開發設計

① 頁面跳轉  ② 相容性支援  ③ 展示效果

2. SEO優化

3. 維護

① 後臺維護  ② 流量轉發

4. 安全

① 偽靜態頁面

配置語法

systax: rewrite [正則表示式 替換前的URL] [替換後的URL] [標識];

default: 無配置

context: server域/location域/if判斷裡

配置例項: rewrite ^(.*)$ /pages/maintain.html break;  # 把所有的請求都跳轉至maintain.html頁面, break是一個識別符號.

正則表示式

常用的正則表示式規則: 

. 匹配除換行符以外的任意字元
? 重複0次或1次
+ 重複1次或多次
* 最少連結數, 哪臺伺服器的連線數少就往那臺伺服器分發
\d 匹配數字
^ 匹配字串的開始
$ 匹配字串的結尾
{n}

重複n次

{n,} 重複n或更多次
[c] 匹配單個字元c
[a-z] 匹配a-z小寫字母中的任意一個
\ 轉義字元, 如: 轉義一個字尾的點(index\.html$)
() 匹配括號之間的內容, 通過$1、$2呼叫

$1、$2的舉例:

if($http_user_agent ~ MSIE){
    rewrite ^(.*)$ /msie/$1 break;  //(.*) 匹配所有檔名, 將其路徑改為/msie/[該檔名]
}

FLAG

flag是一個標識位, 標識rewrite的型別

last 停止rewrite的檢測
break 停止rewrite的檢測
redirect 返回302臨時重定向, 位址列會顯示跳轉後的地址
permanent 返回301永久重定向, 位址列會顯示跳轉後的地址(後面再次訪問也會定向至該地址, 除非清理快取)

break / last:

進入default.conf配置:

此時:

① 訪問 http://192.168.19.136/test/  返回  {"status":"success"}

② 訪問 http://192.168.19.136/break  返回  404

③ 訪問 http://192.168.19.136/last  返回  {"status":"success"}

結論:

當訪問帶有/test/的url時, 預設返回{"status":"success"}; 當訪問帶有/break的url時, rewrite至/test/的路徑下, 由於找不到該目錄的存在, 返回404; 當訪問帶有/last的url時, rewrite至/test/的目錄下, 再重新以這個rewrite的url進行又一次請求, 此時跟第①種情況一樣, 所有返回{"status":"success"}.

redirect / permanent:

進入default.conf配置:

測試① redirect的效果

1) 把last開啟, 註釋掉redirect, 重啟nginx, 訪問: http://192.168.19.136/last

2) redirect開啟, 註釋掉last, 重啟nginx, 繼續訪問: http://192.168.19.136/last

結論:

對於last, 則直接返回200, 對於redirect, 則會先重定向至指定地址, 返回302和重定向的地址, 並再次請求, 返回200.

測試② redirect和permanent的區別

1) redirect開啟, permanent註釋掉, 重啟nginx, 訪問: http://192.168.19.136/Milky-Way

此時關閉nginx服務, 並再次訪問: http://192.168.19.136/Milky-Way

2) permanent開啟, redirect註釋掉, 訪問: http://192.168.19.136/Milky-Way

此時關閉nginx服務, 並再次訪問: http://192.168.19.136/Milky-Way

結論:

redirect: 臨時重定向功能, 當nginx服務端關閉之後, 再次訪問時會再次向服務端發出請求, 此時肯定無法給出響應, 也就無法訪問成功;

permanent: 永久重定向功能, 當nginx服務端關閉之後, 再次訪問時不需要再次向服務端發出請求, 此時直接跳轉, 返回200狀態碼.

規則場景

場景① 

需要兩臺伺服器: 192.168.19.136 和 192.168.19.143

136伺服器配置:

143伺服器配置: 需要新建一個121.html檔案

啟動伺服器, 分別訪問: 192.168.19.136/course-11-22-33.html / 192.168.19.136/nginx / 192.168.19.136/你好

結果:

③ 重定向至百度搜索

注: rewrite規則的優先順序: rewrite規則書寫在不同的地方其優先順序不同(http域 > server域 > location域)