摘要:根據官方文檔說明,模塊是用于使用正則表達式更改請求,有條件地選擇配置,并返回重定向。指令停止執行模塊的指令集,但是其他模塊指令不受影響。可以使用標志來終止指令的進一步處理。
這是 Nginx 學習總結的第四篇,上一篇介紹到了 Nginx 學習總結(3) —— Location 模塊,這一篇會對Rewrite模塊 做一些總結。根據官方文檔說明,Rewrite 模塊是用于使用 PCRE 正則表達式更改請求 URI,有條件地選擇配置,并返回重定向。
表面看,rewrite 和 location 的功能有點像,都能實現跳轉,然而它們的區別在于:rewrite 是在同一域名內更改獲取資源的路徑,而 location 是對一類路徑做控制訪問或反向代理,并且可以 proxy_pass 到其他機器。
很多情況下 rewrite 也會寫在 location 里,它們的執行順序是:
執行 server 塊的 rewrite 指令;
執行 location 匹配;
執行選定的 location 中的 rewrite 指令。
如果其中某步 URI 被重寫,則重新循環執行1-3,直到找到真實存在的文件;循環超過10次,則返回 500 Internal Server Error 錯誤。指令 1. break
停止執行 ngx_http_rewrite_module 模塊的指令集,但是其他模塊指令不受影響。
Context: server, location, if
server { listen 80; # 此處 break 會停止執行 server 塊的 return 指令(return 指令屬于rewrite模塊) # 如果把它注釋掉 則所有請求進來都返回 ok 字符串 break; return 200 "ok"; location = / { root /usr/share/nginx/html; index index.php index.html index.htm; } }2. if
依據指定的條件決定是否執行 if 塊語句中的內容。
Context: server, location
if 中的幾種判斷條件:
一個變量名,如果變量 $variable 的值為空字符串或者字符串 "0",則為 false;
變量與一個字符串的比較,相等為 = 不相等為 !=;
變量與一個正則表達式的模式匹配,操作符可以是:~ 區分大小寫的正則匹配; ~* 不區分大小寫的正則匹配, !~ 、!~* 前面兩者的非;
檢測文件是否存在,使用 -f (存在) 和 !-f (不存在);
檢測路徑是否存在,使用 -d (存在) 和 !-d (不存在) 后面判斷可以是字符串也可是變量;
檢測文件、路徑、或者鏈接文件是否存在,使用 -e (存在) 和 !-e (不存在) ,后面判斷可以是字符串也可是變量;
檢測文件是否為可執行文件,使用 -x (可執行) 和 !-x (不可執行),后面判斷可以是字符串也可是變量。
可以用作 if 判斷的全局變量:
$args 這個變量等于請求行中的參數,同 $query_string
$content_length 請求頭中的 Content-length 字段
$content_type 請求頭中的 Content-Type 字段
$document_root 當前請求在 root 指令中指定的值
$host 請求主機頭字段,否則為服務器名稱
$http_user_agent 客戶端 agent 信息
$http_cooki 客戶端 cookie 信息
$limit_rate 這個變量可以限制連接速率
$request_method 客戶端請求的動作,通常為 GET 或 POST
$remote_addr 客戶端的 IP 地址
$remote_port 客戶端的端口
$remote_user 已經經過 Auth Basic Module 驗證的用戶名
$request_filename 當前請求的文件路徑,由 root 或 alias 指令與 URI 請求生成
$scheme 請求協議,如 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 相同
set $variable "0"; if ($variable) { # 不會執行,因為 "0" 為 false break; } # 變量與一個字符串的比較 if ($request_method = POST) { return 405; } # 變量與正則表達式的匹配 if ($http_cookie ~* "id=([^;]+)(?:;|$)") { set $id $1; } if ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /msie/$1 break; } # 檢查文件是否存在,字符串與變量均可 if ( !-f "/data.log" ) { break; } if ( !-f $filename ) { break; }
if 關鍵字后必須加一個空格符3. return
停止處理并將指定的 code 碼返回給客戶端。 從 0.8.42 版本開始, return 語句可以指定重定向 URL (狀態碼可以為如下幾種 301,302,303,307),也可以為其他狀態碼指定響應的文本內容,并且重定向的 URL 和響應的文本可以包含變量。
Context: server, location, if
# return code [text]; location = /ok { return 200 "ok"; # 返回 ok 給客戶端 } # return code URL; location = /redirect { return 302 http://www.baidu.com; # 臨時重定向 } # return URL; location = /redirect { return http://www.baidu.com; # 臨時重定向 }4. rewrite
使用指定的正則表達式匹配請求 URL,如果匹配成功,則根據規則更改 URL。rewrite 指令按照它們在配置文件中出現的先后順序執行。可以使用 flag 標志來終止指令的進一步處理。如果替換字符串以 http://、https:// 或 $scheme 開頭,則停止處理后續內容,并直接重定向返回給客戶端。語法:rewrite regex replacement [flag];
Context: server, location, if
# 第一種情況,帶 http:// location / { rewrite /test1/(.*) http://www.$1.com; return 200 "ok"; } # 在瀏覽器中訪問,被臨時重定向到 www.baidu.com # 后面的 return 指令將沒有機會執行了 # 第二種情況,不帶 http:// location / { rewrite /test1/(.*) www.$1.com; return 200 "ok"; } # 在瀏覽器中訪問,返回了 ok
rewrite 的四個 flag:
last 停止處理當前的 ngx_http_rewrite_module 的指令集,并開始搜索與更改后的 URL 相匹配的 location;
break 停止處理當前的 ngx_http_rewrite_module 指令集;
redirect 返回 302 臨時重定向;
permanent 返回 301 永久重定向。
location / { # 順序執行如下兩條 rewrite 指令 # rewrite 后面沒有任何 flag 時就順序執行 # 當 location 中沒有 rewrite 模塊指令可被執行時,就重寫發起新一輪 location 匹配 rewrite ^/test1 /test2; rewrite ^/test2 /test3; # 此處發起新一輪location匹配,重寫后的 url 為 /test3 } location = /test2 { return 200 "/test2"; } location = /test3 { return 200 "/test3"; } # 發送如下請求 # curl 127.0.0.1:8080/test1 # /test3
location / { rewrite ^/test1 /test2; rewrite ^/test2 /test3 last; # 此處發起新一輪 location 匹配,重寫后的 url 為 /test3 rewrite ^/test3 /test4; } location = /test2 { return 200 "/test2"; } location = /test3 { return 200 "/test3"; } location = /test4 { return 200 "/test4"; } # 發送如下請求 # curl 127.0.0.1:8080/test1 # /test3
location / { rewrite ^/test1 /test2; rewrite ^/test2 /more/index.html break; # 終止執行后續 rewrite 模塊指令,重寫后的 url 為 /more/index.html rewrite /more/index.html /test4; proxy_pass https://www.baidu.com; # 因為 proxy_pass 不是 rewrite 模塊的指令,所以它不會被 break 終止 } # 發送如下請求 # curl 127.0.0.1:8080/test1 # 代理到 百度產品大全頁面: https://www.baidu.com/more/index.html;5. rewrite_log
開啟或者關閉 rewrite 模塊指令的執行日志,如果開啟,則記錄下 notice 級別的日志到 error_log 中,默認為關閉 off。
Context: http, server, location, if6. set
設置指定變量的值。變量的值可以包含文本,變量或者是它們的組合形式。
Context: server, location, if
location / { set $var1 "host is "; set $var2 $host; set $var3 " uri is $request_uri"; return 200 "response ok $var1$var2$var3"; } # 發送如下請求 # curl 127.0.0.1:8080/test # response ok host is 127.0.0.1 uri is /test
參考文章:
搞懂 nginx 的 rewrite 模塊
nginx 配置 location 總結及 rewrite 規則寫法
Module ngx_http_rewrite_module
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/39850.html
摘要:深度學習篇一動靜分離通過中間件將動態請求和靜態請求進行分離。原因分離資源,減少不必要的請求消耗,減少請求延時。關閉后,重定向會失效。驗證規則保持一致。啟動,也會要求你輸入密碼。根據用戶的信息等信息區別根據用戶的地址實現灰度發布示意圖 Nginx-深度學習篇 一、動靜分離 通過中間件將動態請求和靜態請求進行分離。原因:分離資源,減少不必要的請求消耗,減少請求延時。 動態和靜態請求圖例:s...
摘要:深度學習篇一動靜分離通過中間件將動態請求和靜態請求進行分離。原因分離資源,減少不必要的請求消耗,減少請求延時。關閉后,重定向會失效。驗證規則保持一致。啟動,也會要求你輸入密碼。根據用戶的信息等信息區別根據用戶的地址實現灰度發布示意圖 Nginx-深度學習篇 一、動靜分離 通過中間件將動態請求和靜態請求進行分離。原因:分離資源,減少不必要的請求消耗,減少請求延時。 動態和靜態請求圖例:s...
摘要:經由超文本傳輸協議通信,但是數據包由安全協議加密,實現加密數據與認證功能。該模塊指令定義相關設置證書文件,私鑰文件,會話緩存等內容。允許在客戶端建立會話時傳遞請求服務器名稱,這樣服務器就會知道該發送哪個虛擬主機下的證書文件。 1、nginx基本狀態信息頁面 配置示例: location /basic_status { stub_...
閱讀 3199·2021-11-10 11:36
閱讀 3145·2021-11-02 14:39
閱讀 1726·2021-09-26 10:11
閱讀 4929·2021-09-22 15:57
閱讀 1685·2021-09-09 11:36
閱讀 2053·2019-08-30 12:56
閱讀 3487·2019-08-30 11:17
閱讀 1702·2019-08-29 17:17