1. 程式人生 > >Nginx (五)——Rewrite 語法介紹

Nginx (五)——Rewrite 語法介紹

編譯 超過 .com 多條件 dsa 訪問日誌 cond 例子 新的

一、rewrite模塊介紹(Nginx_http_rewrite_module)

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 語法介紹