Nginx (五)——Rewrite 語法介紹
nginx通過ngx_http_rewriet_module模塊支持url重寫、支持if條件判斷,但不支持else。另外該模塊需要PCRE支持,應該在編譯nginx時指定PCRE支持。根據相關變量重定向和選擇不同的配置,從一個location跳轉到另一個location,不過這樣的循環最多可執行10次,超過後Nginx將返回500錯誤。同時,重寫模塊包含set指令,來創建新的變量並設其值,這在有些情景下是有用的,如記錄條件標識、傳遞參數到其他location、記錄做了什麽等等。學習rewrite之前要對正則表達式很熟悉,以下列出一些常用的正則表達式元字符:
. :匹配除換行符以外的任意字符。
?:重復0次或1次
+ :重復1次或更多次
* :重復0次或更多次
\d:匹配數字
^ : 匹配字符串的開始字符
$ : 匹配字符串的結束字符
{n}:重復n次
{n,}:重復n次或更多次
[c] :匹配單個字符c
[a-z]:匹配a-z小寫字母的任意一個
二、rewrite 重寫中用到的指令
if(條件){} 設定條件,再進行重寫
set# 設置變量
return # 返回狀態碼
break # 跳出rewrite
rewrite # 重寫
三、指令介紹及實驗測試
1. if 語法格式
if 空格 (條件){
重寫模式
}
條件怎麽寫?
答:3種寫法
1:“=”來判斷相等,用於字符串比較
2: “~”用正則來匹配(此處的正則區分大小寫)
“~*”不區分大小寫的正則
3: -f -d -e 來判斷是否為文件,為目錄,是否存在
例子1:使用if 語句,禁止IP地址訪問
location / {
if ($remote_addr = 192.168.40.1) {
return 403;
}
if ($http_user_agent ~ rv:11.0) {
rewrite ^.*$ /ie.html;
break; #(不break會循環重定向)
}
if (!-e $document_root$fastcgi_script_name) {
rewrite ^.*s /404.html break;
}
註:此處還要加break,
以xx.com/dsafsd.html這個不存在的頁面為例,
因為我們觀察訪問日誌,日誌中顯示的訪問路徑,依然是GET/dsafsd.html HTP/1.1
提示:服務器內部的rewrite和302跳轉不一樣。
跳轉的話URL都變了,變成了重新http請求404.html,而內部rewrite,上下文沒變,
就是說 fastcgi_script_name 仍然是dsafsd.html,因此,會循環重定向。
四、set用法
set是設置變量用的,可以用來達到多條件判斷時作標誌用。
達到Apache下的rewrite_condition的效果。
如果:判斷IE並重寫,且不用break:
if ($http_user_agent ~* rv:11.0) {
set $isie 1;
}
if ($fastcgi_script_name = ie.html) {
set $isie 0;
}
if ($isie = 1) {
rewrite ^.*$ ie.html;
}
Nginx (五)——Rewrite 語法介紹