Nginx正则表达式与location匹配简介
提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
文章目錄
- 一、nginx rewrite概述
- 1.概述
- 2. 跳轉(zhuǎn)場景?
- 3. 跳轉(zhuǎn)實現(xiàn)
- 4. rewrite實際場景
- 二、nginx 正則表達式
- 1.正則表達式元字符
- 2. 正則表達的優(yōu)勢
- 3.Nginx使用正則的作用
- 1. Rewrite命令語法
- 2. rewrite執(zhí)行順序
- 四、location 分類和優(yōu)先級
- 3. 比較rewrite和location
- 4. 實際網(wǎng)站使用中,至少有三個匹配規(guī)則定義
- 五、rewrite 跳轉(zhuǎn)
- 1、基于域名的跳轉(zhuǎn)
- 3、基于舊域名跳轉(zhuǎn)到新域名后面加目錄
一、nginx rewrite概述
1.概述
URL:就是一個具體路徑/位置
URI:指的是一個擁有相同類型/特性的對象集合
?location是為了匹配訪問的路徑(URL)??if 做為分支判斷,并且if分支,僅支持單分支??rewrite:對訪問路徑進行改寫大分支:??1、改寫的路徑??在Nginx服務(wù)器上-改寫路徑??2、?改寫的路徑??在后端/其他服務(wù)器上-跳轉(zhuǎn)?2. 跳轉(zhuǎn)場景?
?1、可以調(diào)整用戶瀏覽的URL,看起來更規(guī)范,合理?
?2、為了讓搜索引擎搜錄網(wǎng)站內(nèi)容及用戶體驗更好,企業(yè)會將動態(tài)URL地址偽裝成靜態(tài)地址提供服務(wù)。?
?3、網(wǎng)址換新域名后,讓舊的訪問跳轉(zhuǎn)到新的域名上。例如,訪問京東的360buy.com會跳轉(zhuǎn)到j(luò)d.com。?
?4、服務(wù)端某些業(yè)務(wù)調(diào)整?
?5、根據(jù)特殊變量、目錄、客戶端的信息進行URL調(diào)整等。
3. 跳轉(zhuǎn)實現(xiàn)
1、?Nginx是通過ngx_http_rewrite_module模塊支持url重寫、支持if條件判斷,但不支持else。
2、另外該模塊需要 PCRE支持,應(yīng)在編譯Nginx時指定PCRE 支持,默認已經(jīng)安裝。
3、根據(jù)相關(guān)變量重定向和選擇不同的配置,從一個location跳轉(zhuǎn)到另一個location,不過這樣的循環(huán)最多可以執(zhí)行10次,超過后Nginx將返回500錯誤。
4、重寫模塊包含set指令,來創(chuàng)建新的變量并設(shè)其值,這在有些情景下非常有用的,如記錄條件標識、傳遞參數(shù)到其他location、記錄做了什么等等。
5、rewrite功能就是使用Nginx提供的全局變量或自己設(shè)置的變量,結(jié)合正則表達式和標志位實現(xiàn)url重寫以及重定向。?
4. rewrite實際場景
1.Nginx跳轉(zhuǎn)需求的實現(xiàn)方式
使用rewrite進行匹配跳轉(zhuǎn)(防盜鏈)
使用if匹配全局變量后跳轉(zhuǎn)
使用location匹配再跳轉(zhuǎn)(匹配的訪問 路徑URL location可以匹配本地的重寫以及跨服務(wù)器的跳轉(zhuǎn))
rewrite放在server{}, if{},location{}段中
(多個server模塊 sever模塊里包含location location包含if if里面包含rewrite)
location只對域名后邊的除去傳遞參數(shù)外的字符串起作用
對域名或參數(shù)字符串
使用if全局變量匹配
使用proxy_pass反向代理
二、nginx 正則表達式
正則表達式是一種精確匹配,過濾,篩選的一種執(zhí)行規(guī)范。
1.正則表達式元字符
^ :匹配輸入字符串的起始位置 $ :匹配輸入字符串的結(jié)束位置 * :匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll” + :匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o” ? :匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}” . :匹配除“\n”之外的任何單個字符,若要匹配包括“\n”在內(nèi)的任意字符,請使用諸如“[.\n]”之類的模式 \ :將后面接著的字符標記為一個特殊字符或一個原義字符或一個向后引用。如“\n”匹配一個換行符,而“\$”則匹配“$” \d :匹配純數(shù)字 {n} :重復 n 次 {n,} :重復 n 次或更多次 {n,m} :重復 n 到 m 次 [] :定義匹配的字符范圍 [c] :匹配單個字符 c [a-z] :匹配 a-z 小寫字母的任意一個 [a-zA-Z0-9] :匹配所有大小寫字母或數(shù)字 () :表達式的開始和結(jié)束位置 | :或運算符2. 正則表達的優(yōu)勢
1、精確匹配,減少遍歷的消耗
2、節(jié)省服務(wù)響應(yīng)的資源消耗
3、提高用戶體驗感
4、提高服務(wù)器并發(fā)時、處理效率/性能
3.Nginx使用正則的作用
Nginx作為運維角度前段接受、想用客戶請求的直接對服務(wù)器所以需要考慮到Nginx的執(zhí)行效率(精確匹配-類比)、性能(資源消耗)、抗壓能力(高并發(fā)時處理能力)、用戶體驗感(用戶訪問群體)
#三、rewrite命令
1. Rewrite命令語法
rewrite < regex > < replacement > [flag] regex:正則表達式 replacement :跳轉(zhuǎn)后的內(nèi)容 flag:rewrite支持的flag標記2. rewrite執(zhí)行順序
執(zhí)行server塊里面的rewrite指令
執(zhí)行l(wèi)ocation匹配
執(zhí)行選定的location中的rewrite指令
四、location 分類和優(yōu)先級
從功能看,rewrite 和 location 似乎很像,都能實現(xiàn)跳轉(zhuǎn),主要區(qū)別在于 rewrite 是在同一域名內(nèi)更改獲取資源的路徑,而 location 是對一類路徑做控制訪問或反向代理,還可以 proxy_pass 到其他機器。
| 標記 | 說明 |
| ~ | 執(zhí)行一個正則匹配,區(qū)分大小寫 |
| ~* | 執(zhí)行一個正則匹配,不區(qū)分大小寫 |
| !~ | 執(zhí)行一個正則匹配,區(qū)分大小寫并取反(區(qū)分大小寫不匹配) |
| !~* | 執(zhí)行一個正則匹配,不區(qū)分大小寫并取反(不區(qū)分大小寫不匹配) |
| ^~ | 普通字符匹配:使用前綴匹配,如果匹配成功,則不在匹配其他location |
| = | 普通字符精確匹配,也就是完全匹配 |
| @ | 定義一個命名的location,使用在內(nèi)部命令時 |
相同類型的表達式,字符串長的會優(yōu)先匹配
按優(yōu)先級排列
① = 類型
② ^~類型表達式
③ 正則表達式 (和 *) 類型
④常規(guī)字符串匹配類型,按前綴匹配
⑤ 通用匹配(/),如果沒有其他匹配,任何請求都會匹配到
匹配某個具體文件
(location=完整路徑) > (location 完整路徑) > (location *完整路徑) >(location~完整路徑) > (location完整路徑) > (location /)
用目錄做匹配訪問某個文件
(location=目錄) > (location ^ 目錄/) > (location 目錄 ) > (location~*目錄) > (location目錄)
示例:
=為精確匹配 / ,主機名后面不能帶任何字符串,比如訪問 / 和 /data,則 / 匹配,/data 不匹配
再比如 location = /abc,則只匹配/abc ,/abc/或 /abcd不匹配。若 location /abc,則即匹配/abc 、/abcd/ 同時也匹配 /abc/。
匹配任何以 /documents/ 開頭的地址,匹配符合以后,還要繼續(xù)往下搜索其它 location
只有其它 location后面的正則表達式?jīng)]有匹配到時,才會采用這一條
匹配任何以 /documents/abc 開頭的地址,匹配符合以后,還要繼續(xù)往下搜索其它 location
只有其它 location后面的正則表達式?jīng)]有匹配到時,才會采用這一條
匹配任何以 /images/ 開頭的地址,匹配符合以后,停止往下搜索正則,采用這一條
location ~* \.(gif|jpg|jpeg)$ {}匹配所有以 gif、jpg或jpeg 結(jié)尾的請求
然而,所有請求 /images/ 下的圖片會被 location /images/ 處理,因為 的優(yōu)先級更高,所以到達不了這一條正則。
最長字符匹配到 /images/abc,優(yōu)先級最低,繼續(xù)往下搜索其它 location,會發(fā)現(xiàn) ^ 和 存在
location ~ /images/abc {}匹配以/images/abc 開頭的,優(yōu)先級次之,只有去掉 location ^~ /images/ 才會采用這一條
location /images/abc/1.html {}匹配/images/abc/1.html 文件,如果和正則 ~ /images/abc/1.html 相比,正則優(yōu)先級更高
3. 比較rewrite和location
相同點:
都能實現(xiàn)跳轉(zhuǎn)
不同點:
rewrite是在同一域名內(nèi)更改獲取資源的路徑
location是對一類路徑做控制訪問或反向代理,還可以proxy_pass到其他機器
執(zhí)行順序:
執(zhí)行server塊里面的rewrite指令——》執(zhí)行l(wèi)ocation匹配——》執(zhí)行選定location中的rewrite指令
rewrite改寫訪問的URL路徑(被訪問的HTML、htm、css文件)
location 對一類地址進行權(quán)限控制(認證控制)跳轉(zhuǎn)(跨服務(wù)器進行一個URL跳轉(zhuǎn))
4. 實際網(wǎng)站使用中,至少有三個匹配規(guī)則定義
?直接匹配網(wǎng)站根,通過域名訪問網(wǎng)站首頁比較頻繁,使用這個會加速處理,比如說官網(wǎng)。
這里是直接轉(zhuǎn)發(fā)給后端應(yīng)用服務(wù)器了,也可以是一個靜態(tài)首頁?
?處理靜態(tài)文件請求,這是nginx作為http服務(wù)器的強項
有兩種配置模式,目錄匹配或后綴匹配,任選其一或搭配使用?
?通用規(guī)則,比如用來轉(zhuǎn)發(fā)帶.php、.jsp后綴的動態(tài)請求到后端應(yīng)用服務(wù)器
非靜態(tài)文件請求就默認是動態(tài)請求?
五、rewrite 跳轉(zhuǎn)
1、基于域名的跳轉(zhuǎn)
公司舊域名www.lic.com有業(yè)務(wù)需求變更,需要使用新域名www.zhangbin.com代替,但是舊域名不能廢除,需要跳轉(zhuǎn)到新域名上,而且后面的參數(shù)保持不變。
?vim /usr/local/nginx/conf/nginx.conf
2、基于客戶端 IP 訪問跳轉(zhuǎn)
?今天公司業(yè)務(wù)新版本上線,要求所有 IP 訪問任何內(nèi)容都顯示一個固定維護頁面,只有公司 IP :192.168.223.10訪問正常。
瀏覽器訪問??
?只有 IP 為 192.168.223.10 能正常訪問,其它地址都是維護頁面
3、基于舊域名跳轉(zhuǎn)到新域名后面加目錄
?現(xiàn)在訪問的是 http://zb.lisi.com,現(xiàn)在需要將這個域名下面的訪問都跳轉(zhuǎn)到http://www.li.com/zb
vim /usr/local/nginx/conf/nginx.conf server {listen 80;server_name zb.lisi.com; #域名修改 charset utf-8;access_log /var/log/nginx/www.lisi.com.access.log;#添加location /post {rewrite (.+) http://www.lisi.com/zb$1 permanent; #這里的$1為位置變量,代表/post}location / {root html;index index.html index.htm;} mkdir -p /usr/local/nginx/html/kiki/post systemctl restart nginx.service總結(jié)
以上是生活随笔為你收集整理的Nginx正则表达式与location匹配简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Solved] Javax.Crypt
- 下一篇: Nginx正则表达式locationre