天天看點

nginx重定向到其他url方法_Nginx之URL重寫(rewrite)配置

nginx重定向到其他url方法_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帶端口

nginx重定向到其他url方法_Nginx之URL重寫(rewrite)配置
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的處理行為,包含如下資料:

nginx重定向到其他url方法_Nginx之URL重寫(rewrite)配置
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;

nginx重定向到其他url方法_Nginx之URL重寫(rewrite)配置
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
           
我這兒整理了比較全面的JAVA相關的面試資料,
nginx重定向到其他url方法_Nginx之URL重寫(rewrite)配置
需要領取面試資料的同學,請加群:473984645
nginx重定向到其他url方法_Nginx之URL重寫(rewrite)配置