Nginx服務—Rewirte模塊詳解

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相同。

感謝閱讀

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章