1. 程式人生 > >Nginx之八 URL重寫(rewrite)配置

Nginx之八 URL重寫(rewrite)配置

Nginx URL重寫(rewrite)配置及資訊詳解

1)if判斷指令

語法為if(condition){…}     #對給定的條件condition進行判斷。
如果為真,大括號內的rewrite指令將被執行,if條件(conditon)可以是如下任何內容:

  a:當表示式只是一個變數時,如果值為空或任何以0開頭的字串都會當做false,其他情況為true。
  b: 直接比較變數和內容時,使用 = 或!=
  c: 正則表示式匹配,*不區分大小寫的匹配,!和!*反之。

注意:使用正則表示式字串一般不需要加引號,但是如果含有右花括號“}”或者分號“;”字元時,必須要給整個正則表示式加引號

其他指令:
-f和!-f用來判斷請求檔案是否存在
-d和!-d用來判斷請求目錄是否存在
-e和!-e用來判斷是請求的檔案或者目錄否存在
-x和!-x用來判斷請求的檔案是否可執行

例子:if (-f $request_filename){
        … #判斷請求的檔案是否存在,存在就執行這裡面的程式碼塊
    }

2)break指令

用於中斷當前相同作用域中的Nginx配置,和Java中的break語法類似,可以在server塊和location以及if塊中使用。
語法:break;

3)if 可用的全域性變數
還有$host_host變數,和$host區別如下:
$host不帶埠,$http_host帶埠
在這裡插入圖片描述

4)return指令

 該指令用於完成對請求的處理,直接向客戶端響應狀態的程式碼。和Java中的return語法類似。可以再server塊和location以及if塊中使用。

 語法:return code URL;  #code表示狀態碼,URL表示返回給客戶單的URL地址
 或者:return URL: #當狀態碼是302或者307的時候,可以使用,返回的URL必須包含“http://”、“https://”或者直接使用“$scheme”變數(RequestScheme代表傳輸協議,
Nginx內建變數)
  或者 return [text]; #為返回給客戶端的響應體內容,支援變數的使用

5)rewrite指令

 該指令通過正則表示式的使用來改變URI.可以同時存在一個或者多個指令,按照順序一次對URL進行匹配和處理。該指令可以在server塊後者location塊中配置

  語法:  指令語法:rewrite regex replacement [flag];
   rewrite是實現URL重定向的重要指令,  
   regex:用來匹配URI的正則表示式;
   replacement:匹配成功後用來替換URI中被擷取內容的字串,預設情況如果該字串包含“http://”、"https://"開頭,則不會繼續向下對URI進行其他處理。直接返回重寫的URI給客戶端
    flag

:用來設定rewrite對URI的處理行為,包含如下資料:

標記符號 說明
last 終止在本location塊中處理接收到的URI,並將此處重寫的URI作為新的URI使用其他location進行處理。(只是終止當前location的處理)
break 將此處重寫的URI作為一個新的URI在當前location中繼續執行,並不會將新的URI轉向其他location。
redirect 將重寫後的URI返回個客戶端,狀態碼是302,表明臨時重定向,主要用在replacement字串不以“http://”,“ https://”或“ $scheme” 開頭;
permanent 將重寫的URI返回客戶端,狀態碼為301,指明是永久重定向;

6)rewrite_log指令

該指令用於是否開啟URL重寫日誌的輸出,
語法:
  rewrite_log on | off
  預設是off,如果配置為on,URL重寫的相關日誌將以notice級別輸出到error_log指令配置的日誌檔案中

7)set指令

用來設定新的變數,
  語法: set variable value;
    variable,這個是變數的名稱,這個符號的“$”必須作為變數第一個字元,並且不能和Nginx伺服器預設的全域性變數同名
    value,為變數的值。
比如 set $id “3”; #設定id為3

8)uninitialized_variable_warn指令

這個指令用來配置會用未初始化的變數時,是否記錄警告日誌,
 語法: unitialized_variable_warn on | off
  預設設定時on狀態

9)防盜鏈的例子

   語法:valid_referers none | blocked | server_name | string ...;

這裡表示請求頭部Referer域是否匹配上面值,如果匹配了$invalid_referer 的值為0,沒有相匹配就是1;

字元 說明
none 表示Referer頭域不存在的情況
blocked 檢測Referer頭域的值被防火牆或者代理伺服器刪除或者偽裝的情況,這種情況,該頭域的值不以“http://”或者“https://”開頭
server_name 設定一個或者多個URL,檢測Referer頭域的值是否是這些URL中的某個

10)例子

例子一(域名跳轉):
    server {
            listen 80;
            server_name   abc.com;
            rewrite   ^/(.*)     http://www.ab c.com/$1 permanent;  # 跳轉到www.abc.com網址上
        }
例子二:
  server {
            listen 80;
            server_name   www.myweb.com www.web.info
            if($host ~ myweb\.info){                        #"."需要使用“\”轉義,這裡是匹配到www.web.info時
                     rewrite ^(.*)  http://www.myweb.com/&1 permant;   #永久重定向到http://www.myweb.com網址上&1是匹配的uri
            }
        }
例子三(防盜鏈):
location ~* \.(gif|jpg|png|swf|flv)$ {
    valid_referers none blocked www.vison.com www.wsvison.com;  #這裡表示Referer頭域中的值是none或者blocked或者後面這些網址才會返回去正常的gif|jpg|png|swf|flv檔案,否則執行下面if塊程式碼
    if ($invalid_referer) {  #上面沒有匹配成功,$invalid_referer值為1,否則為0
        return 404;
    } //防盜鏈
}       
其他例子:    
if ($http_user_agent ~ MSIE) {
    rewrite ^(.*)$ /msie/$1 break;
} //如果UA包含"MSIE",rewrite請求到/msid/目錄下

if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
    set $id $1;
 } //如果cookie匹配正則,設定變數$id等於正則引用部分

if ($request_method = POST) {
    return 405;
} //如果提交方法為POST,則返回狀態405(Method not allowed)。return不能返回301,302

if ($slow) {
    limit_rate 10k;
} //限速,$slow可以通過 set 指令設定

if (!-f $request_filename){
    break;
    proxy_pass  http://127.0.0.1; 
} //如果請求的檔名不存在,則反向代理到localhost 。這裡的break也是停止rewrite檢查

if ($args ~ post=140){
    rewrite ^ http://example.com/ permanent;
} //如果query string中包含"post=140",永久重定向到example.com

參考:https://segmentfault.com/a/1190000002797606#articleHeader0