文章目錄
- 前言
- 一、rewrite跳轉實作
- 二、rewrite執行順序
- 三、rewrite跳轉場景
- 四、語法與flg標記說明
- 五、Nginx常用的正則運算式符號
- 六、location
- 1.分類
- 2.常用匹配規則
- 3.優先級
- 4.示例
- 5.匹配規則定義
- 總結:
前言
-
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常用的正則運算式符號
| 符號 | 描述 |
|---|---|
| ^ | 匹配輸入字符申的起始位置 |
| $ | 匹配輸入字串的結束位置 |
| * | 匹配前面的字符零次或多次 |
| + | 匹配前面的字符一次或多次 |
| ? | 匹配前面的字符零次或一次 |
| . | 匹配除"\n"之外的任何單個字符 |
| \ | 將后面接著的字符標記為一個特殊字符或一個原義字符或一個向后參考 |
| \d | 匹配純數字 |
| {n} | 重復n次 |
| {n,} | 重復n次或更多次 |
| {n,m} | 重復n到m次 |
| [] | 定義匹配的字符范圍 |
| [c] | 匹配單個字符 |
| [a-z] | 匹配a-z小寫字母的任意一個 |
| [a-zA-Z0-9] | 匹配所有大小寫字母或數字 |
| () | 運算式的開始和結束位置 |
| | | 或運算子 |
六、location
1.分類
location大致可以分為以下三類:
- 精準匹配:location = / {…}
- 一般匹配:location / {…}
- 正則匹配:location ~ / {…}
2.常用匹配規則
| 符號 | 描述 |
|---|---|
| = | 進行普通字符精準匹配,也就是完全匹配 |
| ^~ | 表示普通字符匹配,使用前綴匹配;如果匹配成功,則不再匹配后續location |
| ~ | 區分大小寫的匹配 |
| ~* | 不區分大小寫的匹配 |
| !~ | 區分大小寫的匹配取非 |
| !~* | 不區分大小寫的匹配取非 |
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.匹配規則定義
①第一個必選規則:
直接匹配網站根,通過域名訪問網站首頁比較頻繁,使用這個會加速處理,比如說官網
可以是一個靜態首頁,也可以直接轉發給后端應用服務器
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后綴的動態請求到后端應用服務器
非靜態檔案請求就默認是動態請求
location / {
proxy_ pass http://tomcat_server;
總結:
比較rewrite和location
相同點:都實作跳轉
不同點:rewrite是在同一域名內更改獲取資源的路徑
location是對一類路徑做控制訪問或反向代理,還可以proxy_pass到其他機器
- rewrite會寫在location里,執行順序
- 執行server塊里面的rewrite指令
- 執行location匹配
- 執行選定的location中的rewrite指令
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/308706.html
標籤:其他
下一篇:網路基礎(十五)-----BGP
