首頁 > 軟體

Nginx中location匹配以及rewrite重寫跳轉詳解

2022-03-21 19:00:28

前言

rewrite功能就是使用nginx提供的全域性變數或自己設定的變數,結合正規表示式和標記實現URL重寫以及重定向
例如:更換域名後需要保持舊的域名能夠轉到新的域名上、某網頁發生改變需要跳轉到新的頁面、網站防盜鏈等等需求

rewrite只能放在server{},location{},if{}中,並且預設只能對域名後面的除去傳遞的引數外的字串起作用
例如:http://www.xjj.com/a/we/index.php?id=1&u=str 只對/a/we/index.php重寫

一、rewrite跳轉實現

Nginx:通過ngx_http_rewrite_module模組支援URL重寫、支援if條件判斷,但不支援else

跳轉:從一個location跳轉到另一個location,迴圈最多可以執行10次,超過後nginx將返回500錯誤

PCRE支援:perl相容正規表示式的語法規則匹配

重寫模組set指令:建立新的變數併為其賦值

二、rewrite執行順序

①執行server快裡面的rewriter指令

②執行location匹配

③執行選定的location中的rewrite指令

三、rewrite跳轉場景

調整使用者瀏覽的URL,看起來更規範,合乎開發及產品人員的需求

為了讓搜尋引擎搜錄網站內容及使用者體驗更好,企業會將動態URL地址偽裝成靜態地址提供服務

網址換新域名後,讓舊的存取跳轉到新的域名上;例如,存取京東的 360buy.com 會跳轉到 jd.com

伺服器端某些業務調整,比如根據特殊變數、目錄、使用者端的資訊進行URL調整等

四、語法與flg標記說明

語法rewrite <regex> <replacement> [flag];

regex:表示正則匹配規則

replacement:表示跳轉後的內容

flag:表示 rewrite 支援的 flag 標記

flag標記說明:

  • last :本條規則匹配完成後,繼續向下匹配新的location URI規則,一般用在 server 和 if 中
  • break :本條規則匹配完成即終止,不再匹配後面的任何規則,一般使用在 location 中
  • redirect :返回302臨時重定向,瀏覽器地址會顯示跳轉後的URL地址
  • permanent :返回301永久重定向,瀏覽器位址列會顯示跳轉後的URL地址

五、Nginx常用的正規表示式符號 

六、location

1.分類

location大致可以分為以下三類:

  • 精準匹配:location = / {…}
  • 一般匹配:location / {…}
  • 正則匹配:location ~ / {…}

2.常用匹配規則

3.優先順序

  • 首先精準匹配 =
  • 其次字首匹配 ^~
  • 其次是按檔案中順序的正則匹配 ~ 或 ~*
  • 然後是匹配不帶任何修飾的字首匹配,即一般匹配
  • 最後交給 / 通用匹配,優先順序最低

 4.範例

 localtion = / {}

=為精準匹配 /,主機名後面不能帶任何字串,比如存取 / 和 /xcf,則 / 匹配,/xcf 不匹配

location / {}

因為所有的地址都以 / 開頭,所以這條規則將匹配到所有的請求,比如存取 / 和 /data,則 / 匹配,/data也匹配

但若後面是正規表示式,則會和最長字串優先匹配(最長匹配)

location /documents/ {}

匹配任何以 /documents/ 開頭的地址,匹配符合以後,還要繼續往下搜尋其它 location

location /documents/abc {}

匹配任何以 /documents/abc 開頭的地址,匹配符合後,還要繼續往下搜尋其他 location

只有其他 location 後面的正規表示式沒有匹配到時,才會採用這一條

location ^~ /images/ {}

匹配任何以 /images/ 開頭的地址,匹配符合以後,停止往下搜尋正則,並採用這條

location ~* .(gif|jpg|jpeg)$ {}

匹配所有以 gif、jpg、jpeg 為結尾的請求

然而,所有請求 /images/ 下的圖片會被 location ^~ /images/ 處理,因為 ^~ 的優先順序更高,所以到達不了這一條正則

location /images/abc {}

最長字元匹配到 /images/abc,優先順序最低,繼續往下搜尋其它 location,會發現 ^~ 和 ~ 存在

location ~ /images/abc {}

匹配以 /images/abc 開頭的,優先順序次之,只有去掉 location ^~ /images 才會採用這一條

location /images/abc/1.html {}

匹配 /images/abc/1.html 檔案,如果和正則 ~ /images/abc/1.html 相比,正則優先順序更高

優先順序總結:

(location = 完整路徑) > (location ^~ 路徑) > (location ,* 正則順序) > (location 部分起始路徑) > (location /)

5.匹配規則定義

①第一個必選規則:

直接匹配網站根,通過域名存取網站首頁比較頻繁,使用這個會加速處理,比如說官網

可以是一個靜態首頁,也可以直接轉發給後端“應用伺服器”——>PHP、Apache(應用伺服器如下圖所示)

 

location / {
    root
    html;
    index
    index.html index.html;
}

②第二個必選規則:

處理靜態檔案請求,這是nginx作為http伺服器的強項(①靜態請求處理的能力②高並行處理能力③資源消耗較低)

有兩種設定模式,目錄匹配或字尾匹配,任選其一或搭配使用

location ^~ /static/ {
    root /webroot/static/;
}
 
location ~* .(html|gif|jpg|jpeg|png|css|js|ico)$ {
    root /webroot/res/ ;
}

③第三個必選規則:

就是通用規則,比如用來轉發帶.php、.jsp字尾的動態請求到後端應用伺服器

非靜態檔案請求就預設是動態請求(跳轉/反向代理)

upstream tomcat_server {
		192.168.126.12:80
		192.168.126.23:80
}
location / {
    proxy_ pass http://tomcat_server;

總結:

1.比較rewrite和location

相同點:都實現跳轉

不同點:rewrite是在同一域名內更改獲取資源的路徑

location是對一類路徑做控制存取或反向代理,還可以proxy_pass到其他機器

2.rewrite會寫在location裡,執行順序

  • 執行server塊裡面的rewrite指令
  • 執行location匹配
  • 執行選定的location中的rewrite指令

3.location優先順序是怎麼排列的?

匹配某個具體檔案

(location = 完整路徑) > (location ^~ 完整路徑) > (location ~* 完整路徑) > (location ~ 完整路徑)> (location /)

用目錄做匹配存取某個檔案

(location = 目錄) > (location ^~ 目錄) > (location ~ 目錄) > (location ~* 目錄)> (location /)

4.檔案、目錄為什麼只會在區不區分大小寫上會有變動

正規表示式:目的是為了儘量精確的匹配

檔案——>儘量精確匹配,區分大小寫 精確,不區分更為精確

目錄——>儘量精確匹配,區分大小寫 更為精確,優先順序更高

到此這篇關於Nginx中location匹配以及rewrite重寫跳轉的文章就介紹到這了,更多相關Nginx location匹配及rewrite重寫內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com