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;
}