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指令5)rewrite指令該指令用于完成對請求的處理,直接向用戶端響應狀态的代碼。和Java中的return文法類似。可以再server塊和location以及if塊中使用。
文法:return code URL; #code表示狀态碼,URL表示傳回給客戶單的URL位址
或者:return URL: #當狀态碼是302或者307的時候,可以使用,傳回的URL必須包含“http://”、“https://”或者直接使用“$scheme”變量(RequestScheme代表傳輸協定,
Nginx内置變量)
或者 return [text]; #為傳回給用戶端的響應體内容,支援變量的使用
該指令通過正規表達式的使用來改變URI.可以同時存在一個或者多個指令,按照順序一次對URL進行比對和處理。該指令可以在server塊後者location塊中配置
文法: 指令文法:rewrite regex replacement [flag];
rewrite是實作URL重定向的重要指令,
regex:用來比對URI的正規表達式;
replacement:比對成功後用來替換URI中被截取内容的字元串,預設情況如果該字元串包含“http://”、"https://"開頭,則不會繼續向下對URI進行其他處理。直接傳回重寫的URI給用戶端
flag:用來設定rewrite對URI的處理行為,包含如下資料:
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指令9)防盜鍊的例子這個指令用來配置會用未初始化的變量時,是否記錄警告日志,
文法: unitialized_variable_warn on | off
預設設定時on狀态
文法:valid_referers none | blocked | server_name | string ...;
這裡表示請求頭部Referer域是否比對上面值,如果比對了$invalid_referer 的值為0,沒有相比對就是1;
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相關的面試資料, 需要領取面試資料的同學,請加群:473984645