Nginx模塊概述—Rewirte模塊詳解
Nginx工作原理
nginx由內核和模塊組成
模塊由結構分爲:
核心模塊: HTTP 模塊、EVENT 模塊和 MAIL 模塊
基礎模塊: HTTP Access 模塊、HTTP FastCGI 模塊、HTTP Proxy 模塊和 HTTP Rewrite 模塊
第三方模塊: HTTP Upstream Request Hash 模塊、Notice 模塊和 HTTP Access Key 模塊
由功能分爲:
Handlers(處理器模塊): 此類模塊直接處理請求,並進行輸出內容和修改 headers 信息等操作。Handlers 處理器模塊一般只能有一個
Filters(過濾器模塊):此類模塊主要對其他處理器模塊輸出的內容進行修改操作,最後由 Nginx 輸出
Proxies(代理類模塊): 此類模塊是 Nginx 的 HTTP Upstream 之類的模塊,這些模塊主要與後端一些服務比如FastCGI 等進行交互,實現服務代理和負載均衡等功能。
這裏我將帶領各位詳細瞭解基礎模塊中的Rewrite模塊
Rewrite模塊
模塊應用場景:
URL看起來更規範、合理
企業會將動態URL地址僞裝成靜態地址提供服務
網址換新域名後,讓舊的訪問跳轉到新的域名.上
服務端某些業務調整
想要執行Rewirte模塊的跳轉功能,就要依靠location、rewrite & if 這三兄弟了
Rewrite
命令格式
rewrite <regex> <replacement> [flag];
其中,
<regex> 代表正則表達式;
<replacement> 代表跳轉後的URL/內容;
[flag] 代表rewrite支持的flag標記(
last—相當於Apache的[L]標記,表示完成rewrite;
break—本條規則匹配完成即終止,不再匹配後面的任何規則;
redirect—返回302臨時重定向,瀏覽器地址會顯示跳轉後的URL地址,爬蟲不會更新url;
permanent—返回301永久重定向,瀏覽器地址欄會顯示跳轉後的URL地址,爬蟲更新url)
應用位置
可應用於server{}, if{}, location{}
段中
Location
用法
標記 | 說明 |
---|---|
~ | 執行一個正則匹配,區分大小寫 |
~* | 執行一個正則匹配,不區分大小寫 |
!~ | 執行一個正則匹配,區分大小寫不匹配 |
!~* | 執行一個正則匹配,不區分大小寫不匹配 |
^~ | 普通字符匹配;使用前綴匹配。如果匹配成功,則不再匹配其他location |
= | 普通字符精確匹配,必須一模一樣,完全匹配 |
@ | 定義一個命名的location,使用在內部定向時 |
匹配規則
通用規則:先匹配正則,再匹配普通。
相同類型的表達式,字符串長的優先匹配,
匹配某個具體文件
(location =完整路徑) > (location ^~完整路徑) > (location ~*完整路徑) > (location ~完整路徑) > (location 完整路徑) > (location /)
用目錄做匹配訪問某個文件
(location=目錄) > (location ^~目錄/)> (location ~ 目錄)>(location ~*目錄) > (location目錄) > (location /)
當rewrite寫在location中時,執行順序爲:
優先: 執行server塊裏面的rewrite指令
然後: 執行location匹配
最後: 執行選定的location中的rewrite指令
IF
用於執行判斷,引出下一步的跳轉操作,通常配合nginx自帶的全局變量使用
能夠用於if判斷的自帶變量如下:
$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相同。