http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_rewrite_module.html#ifphp
首先申明nginx只有if語句作判斷適應,沒有else語句html
if語句的經常使用形式以下:nginx
if(condition){ ... ; }
默認值: —
應用位置: server、location正則表達式
計算指定的condition的值。若是爲真,執行定義在大括號中的指令,並將if指令中的配置指定給請求。if指令會從上一層配置中繼承配置。apache
條件能夠是下列任意一種:瀏覽器
變量名;若是變量值爲空或者是以"0"開始的字符串,則條件爲假; 使用 = 和 != 運算符比較變量和字符串; 使用 ~(大小寫敏感)和 ~*(大小寫不敏感)運算符匹配變量和正則表達式。正則表達式能夠包含匹配組,匹配結果後續可使用變量$1..$9引用。若是正則表達式中包含字符'}'或者';',整個表達式應該被包含在單引號或雙引號的引用中。 使用 -f 和 !-f 運算符檢查文件是否存在; 使用 -d 和 !-d 運算符檢查目錄是否存在; 使用 -e 和 !-e 運算符檢查文件、目錄或符號連接是否存在; 使用 -x 和 !-x 運算符檢查可執行文件;
指令語法:rewrite regex replacement[flag];服務器
默認值:noneiphone
應用位置:server、location、if優化
rewrite是實現URL重定向的重要指令,他根據regex(正則表達式)來匹配內容跳轉到replacement,結尾是flag標記網站
簡單的小例子:
if ($request_uri ~* "tobd") {
rewrite ^/(.*) http://www.baidu.com/ permanent; # 若是匹配成功後跳轉到百度,執行永久301跳轉
}
經常使用正則表達式:
字符 | 描述 |
\ | 將後面接着的字符標記爲一個特殊字符或者一個原義字符或一個向後引用 |
^ | 匹配輸入字符串的起始位置 |
$ | 匹配輸入字符串的結束位置 |
* | 匹配前面的字符零次或者屢次 |
+ | 匹配前面字符串一次或者屢次 |
? | 匹配前面字符串的零次或者一次 |
. | 匹配除「\n」以外的全部單個字符 |
(pattern) | 匹配括號內的pattern |
rewrite 最後一項flag參數:
標記符號 | 說明 |
last | 本條規則匹配完成後繼續向下匹配新的location URI規則 |
break | 本條規則匹配完成後終止,不在匹配任何規則 |
redirect | 返回302臨時重定向 |
permanent | 返回301永久重定向 |
一、基礎知識點
(1)Rewirte規則也稱爲 規則重寫,主要功能是實現瀏覽器訪問HTTP URL的跳轉,其正則表達式是基於Perl語言。
(2)對收縮引擎優化(SEO),利於收索引擎抓取網站頁面。
(3)隱藏網站URL真實地址。
(4)網站變動升級,能夠基於Rewrite臨時重定向到其餘頁面。
(5)有利於服務器實現僞靜態。
二、Rewrite結尾表示符
(1)last:至關於apache裏的(L)標記,表示完成rewrite匹配。(瀏覽器地址欄URL地址不變)
(2)break:本條規則匹配完成後,終止匹配,再也不匹配後面的規則。(瀏覽器地址欄URL地址不變)
(3)redirect:返回302臨時重定向,瀏覽器地址欄會顯示跳轉後的URL地址。
(4)permanent:返回301永久重定向,瀏覽器地址欄會顯示跳轉後的URL地址。
三、Rewrite規則經常使用表達式
(1) . 匹配任何單字符;
(2)? 匹配0到1個字符;只匹配一次;
(3)* 匹配0到多個字符;
(4)+ 匹配1到多個字符;
(5)[0-9] 匹配字符串0-9
(6)[^0-9] 不匹配字符串0-9
(7)^ 字符串開始標誌
(8)$ 字符串結束標誌
(9)\n 轉義換行標誌
四、Nginx Rewrite變量經常使用於匹配HTTP請求頭信息、瀏覽器主機名、URL等。
五、Rewrite配置在nginx的location塊中的配置
(1)將dks.net跳轉至www.dks.net
if($host='dks.net') { rewrite ^/(.*)$ http://www.dks.net/$1 permanent; }
# $host內置nginx變量,匹配用戶訪問的域名
# $1表示引用第一個括號的內容,是用戶輸入的內容;若是不使用$1引用,則只會匹配根
(2)將訪問www.dks.net/跳轉至www.test.com/new.index.html
rewrite ^/$ http://www.test.com/new.index.html permanent;
(3)訪問 /dks/test01/跳轉至/newindex.html,瀏覽器地址不變
rewrite ^/dks/test01/$ /newindex.html last;
(4)多域名跳轉 www.dks.net
if($host!='www.dks.net') { rewrite ^/(.*)$ http://www.dks.net/$1 permanert; }
(5)訪問文件和目錄不存在跳轉至index.php
!-f 和 -f 判斷文件
!-d 和 -d 判斷目錄
!-e 和 -e 判斷文件和目錄
!-x 和 -x 判斷文件是否可執行
if(!-e $request filename) { rewrite ^/(.*) /index.php last; }
(6)目錄對換 /xxx/123456——> /xxx?id=123456
\d+ 表明匹配數字,至關於[0-9]
rewrite ^/(.+)/(\d+) /$1?id=$2 last;
(7)判斷瀏覽器User Agent跳轉
if($http_user_agent ~MSIE) { rewrite ^(.*)$/ie/$1 break; }
(8)禁止訪問以.sh | .flv | .mps爲文件後綴的文件
location ~.*\.(sh|flv|mp3)$ { return 403; }
(9)將移動用戶訪問跳動至移動端。
if($http_user_agent ~* "(Android)|(iphone)|(Mobile)|(WAP)|(UCWEB)") { rewrite ^/$ http://m.dks.net/ permanent; }
(10)匹配URL訪問字符串跳轉
if($args ~* tid=13) { return 404; }
(11)訪問/10690/dks/123 跳轉至/index.php?tid/10690/items=123
rewrite ^/([0-9]+)/dks/(.+)$ /index.php?tid/$1/items=$2 last;
六、多rewrite規則跳轉
rewrite ^/dks/(.*)/$ /newindex.html permanent; #能夠跳轉 rewrite ^/newindex.html$ /dks/test01/index.html permanent;
rewrite ^/dks/(.*)/$ /newindex.html break; #break 終止跳轉,執行下一條rewrite規則 rewrite ^/newindex.html$ /dks/test01/index.html permanent;
rewrite ^/dks/(.*)/$ /newindex.html last; #last 跳轉,但下面那條rewrite規則匹配不上,由於last使地址欄url地址不變,因此下面的那條rewrite規則匹配不上;
rewrite ^/newindex.html$ /dks/test01/index.html permanent; #此條規則匹配不上上邊的url地址