rewrite是nginx伺服器提供的乙個重要基本功能,是web伺服器產品中幾乎必備的功能。主要的作用是用來實現url的重寫。
注意:nginx伺服器的rewrite功能的實現依賴於pcre的支援,因此在編譯安裝nginx伺服器之前,需要安裝pcre庫。nginx使用的是ngx_http_rewrite_module模組來解析和處理rewrite功能的相關配置。
rewrite的應用場景:
變數說明
$args
變數中存放了請求url中的請求引數。比如中的"arg1=value1&arg2=value2",功能和$query_string一樣
變數儲存的是使用者訪問服務的**資訊(如果通過瀏覽器訪問,記錄的是瀏覽器的相關版本資訊)
$host
變數儲存的是訪問伺服器的server_name值
$document_uri
變數儲存的是當前訪問位址的uri。比如中的"/server",功能和$uri一樣
$document_root
變數儲存的是當前請求對應location的root值,如果未設定,預設指向nginx自帶html目錄所在位置
$content_length
變數儲存的是請求頭中的content-length的值
$content_type
變數儲存的是請求頭中的content-type的值
變數儲存的是客戶端的cookie資訊,可以通過add_header set-cookie 'cookiename=cookievalue'來新增cookie資料
$limit_rate
變數中儲存的是nginx伺服器對網路連線速率的限制,也就是nginx配置中對limit_rate指令設定的值,預設是0,不限制。
$remote_addr
變數中儲存的是客戶端的ip位址
$remote_port
變數中儲存了客戶端與服務端建立連線的埠號
$remote_user
變數中儲存了客戶端的使用者名稱,需要有認證模組才能獲取
$scheme
變數中儲存了訪問協議
$server_addr
變數中儲存了服務端的位址
$server_name
變數中儲存了客戶端請求到達的伺服器的名稱
$server_port
變數中儲存了客戶端請求到達伺服器的埠號
$server_protocol
變數中儲存了客戶端請求協議的版本,比如"http/1.1"
$request_body_file
變數中儲存了發給後端伺服器的本地檔案資源的名稱
$request_method
變數中儲存了客戶端的請求方式,比如"get","post"等
$request_filename
變數中儲存了當前請求的資源檔案的路徑名
$request_uri
變數中儲存了當前請求的uri,並且攜帶請求引數,比如中的"/server?id=10&name=zhangsan"
該指令用來設定乙個新的變數。
語法set $variable value;
預設值—
位置server、location、if
variable:變數的名稱,該變數名稱要用"$"作為變數的第乙個字元,且不要與nginx伺服器預設的全域性變數同名。
value:變數的值,可以是字串、其他變數或者變數的組合等。
測試:
location /set
該指令用來支援條件判斷,並根據條件判斷結果選擇不同的nginx配置。
語法if (condition)
預設值—
位置server、location
condition為判定條件,可以支援以下寫法:
變數名。如果變數名對應的值為空字串或"0",if都判斷為false,其他條件為true。
if ($param)
使用"="和"!="比較變數和字串是否相等,滿足條件為true,不滿足為false
if ($request_method = post)
注意:此處和j**a不太一樣的地方是字串不需要新增引號,並且等號和不等號前後到需要加空格。
使用正規表示式對變數進行匹配,匹配成功返回true,否則返回false。變數與正規表示式之間使用"","*","!","!*"來連線。
"~"代表匹配正規表示式過程中區分大小寫,
"~*"代表匹配正規表示式過程中不區分大小寫
"!"和"!*"剛好和上面取相反值,如果匹配上返回false,匹配不上返回true
if ($http_user_agent ~ msie)
注意:正規表示式字串一般不需要加引號,但是如果字串中包含"}"或者是";"等字元時,就需要把引號加上。
判斷請求的檔案是否存在使用"-f"和"!-f",
if (-f $request_filename)
if (!-f $request_filename)
判斷請求的目錄是否存在使用"-d"和"!-d"
判斷請求的目錄或者檔案是否存在使用"-e"和"!-e"
判斷請求的檔案是否可執行使用"-x"和"!-x"
測試:
location /if
該指令用於中斷當前相同作用域中的其他nginx配置。與該指令處於同一作用域的nginx配置中,位於它前面的指令配置生效,位於後面的指令配置無效。並且break還有另外乙個功能就是終止當前的匹配並把當前的uri在本location進行重定向訪問處理。
語法break;
預設值—
位置server、location、if
該指令用於完成對請求的處理,直接向客戶端返回。在return後的所有nginx配置都是無效的。
語法return code [text];
return code url;
return url;
預設值—
位置server、location、if
code:為返回給客戶端的http狀態**。可以返回的狀態**為0~999的任意http狀態**
text:為返回給客戶端的響應體內容,支援變數的使用
url:為返回給客戶端的url位址
location /testreturn
location /testreturn
location /testreturn
location /testreturn
rewrite指令
該指令通過正規表示式的使用來改變uri。可以同時存在乙個或者多個指令,按照順序依次對url進行匹配和處理。
語法rewrite regex replacement [flag];
預設值—
位置server、location、if
regex:用來匹配uri的正規表示式
replacement:匹配成功後,用於替換uri中被擷取內容的字串。如果該字串是以"http://"或者"https://"開頭的,則不會繼續向下對uri進行其他處理,而是直接返回重寫後的uri給客戶端。
flag:用來設定rewrite對uri的處理行為,可選值有如下:
該指令配置是否開啟url重寫日誌的輸出功能。
語法rewrite_log on|off;
預設值rewrite_log off;
位置http、server、location、if
開啟後,url重寫的相關日誌將以notice級別輸出到error_log指令配置的日誌檔案彙總。
rewrite_log on;
error_log logs/error.log notice;
nginx rewrite 重寫規則
1注意點 在重寫的時候,一定要注意,if 和後面的括號是要有乙個空格的 if host com 2.在重寫的時候,需要使用正規表示式 host 代表網域名稱,首先判斷網域名稱,來看這個正則 rewrite de permanent 代表網域名稱下面的 com de 這個路徑下面的,重寫為 其中 1代...
nginx Rewrite語法詳解
重寫中用到的指令 if 條件 設定條件,再進行重寫 set 設定變數 return 返回狀態碼 break 跳出rewrite rewrite 重寫 跳轉的話url都變了,變成重新http請求404.html,而內部rewrite,上下文沒變,就是說 fastcgi script name 仍然是 ...
Nginx Rewrite規則初探
nginx rewrite nginx url位址重寫 rewrite 主要的功能就是實現url的重寫,nginx的rewrite規則採用pcre,perl相容正規表示式的語法規則匹配,如果需要nginx的rewrite功能,在編譯nginx之前,需要編譯安裝pcre庫。通過rewrite規則,可以...