1. 程式人生 > >nginx之ReWrite語法

nginx之ReWrite語法

轉載自:https://www.cnblogs.com/crazylqy/p/6892010.html

1 ReWrite語法

Nginx提供的全域性變數或自己設定的變數,結合正則表示式和標誌位實現url重寫以及重定向。

rewrite只能放在server{},location{},if{}中,

並且只能對域名後邊的除去傳遞的引數外的字串起作用。

Rewrite主要的功能就是實現URL的重寫,Nginx的Rewrite規則採用Pcre,perl相容正則表示式的語法規則匹配,如果需要Nginx的Rewrite功能,在編譯Nginx之前,需要編譯安裝PCRE庫。

通過Rewrite規則,可以實現規範的URL、根據變數來做URL轉向及選擇配置。

    rewrite    <regex>    <replacement>    [flag];

    關鍵字      正則        替代內容          flag標記

flag標記說明:

last  #本條規則匹配完成後,繼續向下匹配新的location URI規則

break  #本條規則匹配完成即終止,不再匹配後面的任何規則

redirect  #返回302臨時重定向,瀏覽器地址會顯示跳轉後的URL地址

permanent  #返回301永久重定向,瀏覽器位址列會顯示跳轉後的URL地址

例:

rewrite ^/(.*) http://www.czlun.com/$1 permanent;

說明:                                        

rewrite為固定關鍵字,表示開始進行rewrite匹配規則

regex部分是 ^/(.*) ,這是一個正則表示式,匹配完整的域名和後面的路徑地址

replacement部分是http://www.czlun.com/$1 ,$1是取自regex部分()裡的內容,1代表匹配第一種正則表示式。匹配成功後跳轉到的URL。

flag部分 permanent表示永久301重定向標記,即跳轉到新的 http://www.czlun.com/$1 地址上

1.1 ReWrite相關指令

指令

預設值

使用範圍

作用

break

none

if,server,location

完成當前的規則集,不再處理rewrite指令,需要和last加以區分

if ( condition )

{ ... }

none

server,location

用於檢測一個條件是否符合,符合則執行大括號內的語句。不支援巢狀,不支援多個條件&&或||處理

return

none

server,if,location

用於結束規則的執行和返回狀態碼給客戶端。狀態碼的值可以是:204,400,402~406,408,410,411,413,416以及500~504,另外非標準狀態碼444,表示以不傳送任何的Header頭來結束連線。

rewrite regex replacement flag

 

server,location,if

該指令根據表示式來重定向URI,或者修改字串。指令根據配置檔案中的順序來執行。注意重寫表示式只對相對路徑有效。

uninitialized_variable_warn on|off

on

http,server,location,if

該指令用於開啟和關閉未初始化變數的警告資訊,預設值為開啟。

set  variable  value

none

 

該指令用於定義一個變數,並且給變數進行賦值。變數的值可以是文字、一個變數或者變數和文字的聯合,文字需要用引號引起來。

1.2 Rewrite全域性變數

rewrite全域性變量表

變數

含義

$args

這個變數等於請求行中的引數,同$query_string

$content length

請求頭中的Content-length欄位。

$content_type

請求頭中的Content-Type欄位。

$document_root

當前請求在root指令中指定的值。

$host

請求主機頭欄位,否則為伺服器名稱。

$http_user_agent

客戶端agent資訊

$http_cookie

客戶端cookie資訊

$limit_rate

這個變數可以限制連線速率。

$request_method

客戶端請求的動作,通常為GET或POST。

$remote_addr

客戶端的IP地址。

$remote_port

客戶端的埠。

$remote_user

已經經過Auth Basic Module驗證的使用者名稱。

$request_filename

當前請求的檔案路徑,由root或alias指令與URI請求生成。

$scheme

HTTP方法(如http,https)。

$server_protocol

請求使用的協議,通常是HTTP/1.0或HTTP/1.1。

$server_addr

伺服器地址,在完成一次系統呼叫後可以確定這個值。

$server_name

伺服器名稱。

$server_port

請求到達伺服器的埠號。

$request_uri

包含請求引數的原始URI,不包含主機名,如”/foo/bar.php?arg=baz”。

$uri

不帶請求引數的當前URI,$uri不包含主機名,如”/foo/bar.html”。

$document_uri

與$uri相同。

1.3 Rewrite語法規則

操作符

含義

= ,!=

比較的一個變數和字串。

~, ~*

與正則表示式匹配的變數,如果這個正則表示式中包含},;則整個表示式需要用"或'包圍。

-f,!-f

檢查一個檔案是否存在。

-d, !-d

檢查一個目錄是否存在。

-e,!-e

檢查一個檔案、目錄、符號連結是否存在。

-x, !-x

檢查一個檔案是否可執行。

1.4 if指令

    if  語法格式
     if 空格 (條件) {
        重寫模式
     }

        # 限制瀏覽器訪問
    if ($http_user_agent ~ Firefox) { 
      rewrite ^(.*)$ /firefox/$1 break; 
    }      

    if ($http_user_agent ~ MSIE) { 
        rewrite ^(.*)$ /msie/$1 break; 
    }      

    if ($http_user_agent ~ Chrome) { 
        rewrite ^(.*)$ /chrome/$1 break; 
    }

1.5 return指令

    # 限制IP訪問
    if  ($remote_addr = 192.168.197.142) {
       return 403;
    }

1.首先從日誌查出ip

修改conf配置檔案

重啟配置檔案訪問發現

 

 

1.6 rewrite指令

#判斷目錄是否存在

#伺服器內部的rewrite和302跳轉不一樣.跳轉的話URL都變了,變成重新http請求index.html,而內部rewrite,上下文沒變。

    if (!-e $document_root$fastcgi_script_name) {
        rewrite ^.*$ /index.html break;
    }

1.7 set指令

# set指令是設定變數用的,可以用來達到多條件判斷時作標誌用

#判斷IE並重寫,且不用break;我們用set變數來達到目的

    if ($http_user_agent ~* msie) {
        set $isie 1;
    }

    if ($fastcgi_script_name = ie.html) {
        set $isie 0;
    }

    if ($isie 1) {
        rewrite ^.*$ ie.html;
    }

 

常用例子

(1)表示訪問路徑有a,b,c,d都跳轉到//127.0.0.1:8080$Request_uri

         location ~^/(a|b|c|d){
            proxy_pass http://127.0.0.1:8080$Request_uri;
            client_max_body_size   10240k;
            client_body_buffer_size   128k;
        }