Nginx高階之Rewrite規則
進階階段的回顧:
作用及應用場景
作用: 實現對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域)