Nginx rewrite理論

Rewrite跳轉場景

URL看起來更規範,合理
企業會將動態URL地址假裝成靜態地址提供服務
網址換新域名後,讓舊的訪問跳轉到新的域名上
服務端某些業務調整

Rewrite跳轉實現

Nginx rewrite理論

Rewrite實用場景

  • Nginx跳轉需求的實現方式
    使用rewrite進行匹配跳轉
    使用if匹配全局變量後跳轉
    使用location匹配再跳轉
  • rewrite放在server{},if{},location{}段中
  • 對域名或參數字符串
    使用if全局變量匹配
    使用proxy_pass反向代理

經常使用的正則表達式元字符

字符 說明
^ 匹配輸入字符串的起始位置
$ 匹配輸入字符串的結束位置
* 匹配前面的字符零次或屢次
+ 匹配前面的字符一次或屢次
匹配前面的字符零次或一次
. 匹配除\n以外的任何單個字符,使用諸如"[.\n]"之類的模式,可匹配包括"\n"在內的任意字符
\d 匹配純數字 [0-9]
{n} 重複屢次
{n,} 重複n次或更屢次
[c] 匹配單個字符c
[a-z] 匹配a-z小寫字母的任意一個
[a-zA-Z] 匹配a-z小寫字母或A-Z大寫字母的任意一個

Rewrite命令

語法:
rewrite <regex>            <replacement>             [flag];
            正則                  跳轉後的內容               rewrite支持的flag標記

flag標記說明:html

標記 說明
last 至關於Apache的[L]標記,表示完成rewrite
break 本條規則匹配完成即終止,再也不匹配後面的任何規則
redirect 返回302臨時重定向,瀏覽器地址會顯示跳轉後的URL地址,爬蟲不會更新url
permanent 返回301永久重定向,瀏覽器地址欄會顯示跳轉後的URL地址,爬蟲更新url

last和break比較:正則表達式

last break
使用場景 通常寫在server和if中 通常使用在location中
URL匹配 不終止重寫後的url匹配 終止重寫後的url匹配

location分類

分類:
    location = patt {} [精準匹配]
    location patt {} [通常匹配]
    location ~ patt {} [正則匹配]

正則匹配的經常使用表達式:瀏覽器

標記 說明
~ 執行一個正則匹配,區分大小寫
~* 執行一個正則匹配,不區分大小寫
!~ 執行一個正則匹配,區分大小寫不匹配
!~* 執行一個正則匹配,不區分大小寫不匹配
^~ 普通字符匹配;使用前綴匹配。若是匹配成功,則再也不匹配其餘location
= 普通字符精準匹配。也就是徹底匹配
@ 定義一個命名的location,使用在內部定向時

location優先級

**相同類型的表達式,字符創長的會優先匹配**
**按優先級排列**
    = 類型
    ^~ 類型表達式
    正則表達式(~和~*)類型
    常規字符串匹配類型,按前綴匹配
    一般匹配(/),若是沒有其餘匹配,任何請求都會匹配到

比較rewrite和location

**相同點**
        都能實現跳轉
**不一樣點**
        rewrite是在同一域名內更改獲取資源的路徑
        location是對一類路徑作控制訪問或方向代理,還能夠proxy_pass到其餘機器
**rewrite會寫在location裏執行順序**
        執行server塊裏面的rewrite指令
        執行location匹配
        執行選定的location中的rewrite指令

location優先級的示例

##精確匹配/,主機名後面不能帶任何字符串
location = / {
[ configuration A ]     
}

##全部的地址都以/開頭,這條規則將匹配到全部請求,但正則和最長字符串會優先匹配
location  / {
[ configuration B ]     
}

##匹配任何以/documents/開頭的地址,當後面正則表達式沒有匹配到時,才起做用
location /documents/ {
[ configuration C ]
}

##匹配任何以/documents/abc開頭的地址,當後面正則表達式沒有匹配到時,纔會起做用
location ~ /documents/abc {
[ configuration D ]
}

##以/images/開頭的地址,匹配符合後,中止往下匹配
location ^~ /images/ {
[ configuration E ]
}

##匹配全部以gif結尾的請求,/images/下的圖片會被[configuration E]處理,由於^~的優先級更高
location ~* \.(gif|jpg|jpeg)$ {
[ configuration F ]
}

##最長字符匹配到/images/abc,優先級最低
location /images/abc {
[ configuration G ]
}

##以/images/abc開頭的,優先級次之
location ~ /images/abc {
[ configuration H ]
}

##若是和正則~/images/abc/1.html相比,正則優先級更高
location /images/abc/1.html {
[ configuration I ]
}

location優先級規則

匹配某個具體文件:
(location = 完整路徑)>(location ^~完整路徑)>(location ~完整路徑)>(location ~完整路徑)>(location 完整路徑)>(location /)
用目錄作匹配訪問某個文件:
(location = 目錄)>(location ^~目錄/)>(location ~ 目錄)>(location ~
目錄)>(location 目錄)>(location /)ide

相關文章
相關標籤/搜索