Nginx location匹配規(guī)則的方法示例
1、語法
location [=|~|~*|^~|@] /uri/ {
...
}
2、說明
從上面的語法出發(fā),可以了解到 location 可以區(qū)分為三個(gè)部分,接下來一個(gè)一個(gè)的研究一下。
1) [=|~|~*|^~|@]
- = : 表示精確匹配后面的url
- ~ : 表示正則匹配,但是區(qū)分大小寫
- ~* : 正則匹配,不區(qū)分大小寫
- ^~ : 表示普通字符匹配,如果該選項(xiàng)匹配,只匹配該選項(xiàng),不匹配別的選項(xiàng),一般用來匹配目錄
- @ : "@" 定義一個(gè)命名的 location,使用在內(nèi)部定向時(shí),例如 error_page
上面定義了幾個(gè)不同的符號,表示不同的匹配規(guī)則,那么先后順序呢?
- = 前綴的指令嚴(yán)格匹配這個(gè)查詢。如果找到,停止搜索;
- 所有剩下的常規(guī)字符串,最長的匹配。如果這個(gè)匹配使用 ^~ 前綴,搜索停止;
- 正則表達(dá)式,在配置文件中定義的順序;
- 如果第 3 條規(guī)則產(chǎn)生匹配的話,結(jié)果被使用。否則,使用第 2 條規(guī)則的結(jié)果。
測試示例1:
location = /world {
return 600;
}
location = /hello {
return 600;
}
location ~ /hellowo {
return 602;
}
location ^~ /hello {
return 601;
}
- 請求 localhost/world 返回600 - 請求 localhost/world2 localhost/test/world 返回其他 - 請求 localhost/hello 返回600 - 請求 localhost/hello/123 返回601 - 請求 localhost/hellow 返回601 - 請求 localhost/hellowo 返回601 - 請求 localhost/test/hellowo 返回602 - 請求 localhost/test/hello 返回其他
因此可以知道:
- = 是精確完整匹配,且優(yōu)先級最高;
- 正則匹配時(shí),如果 ~ 和 ^~ 同時(shí)匹配規(guī)則,則 ^~ 優(yōu)先;
- ^~ 這個(gè)規(guī)則不會匹配請求 url 中后面的路徑,如上面的 /test/hello 沒有匹配上
- ^~ 不支持正則,和 = 相比,范圍更廣,hellowo 是可以被 ^~ 匹配,但是 = 不會匹配;
- ~ 路徑中只要包含就可以匹配,如上面的 /test/hellowo 返回了 602
測試示例2:
location ~ /hello {
return 602;
}
location ~ /helloworld {
return 601;
}
- 請求 localhost/world/helloworld 返回 602 - 請求 localhost/helloworld 返回 602
調(diào)整上面的順序
location ~ /helloworld {
return 601;
}
location ~ /hello {
return 602;
}
- 請求 localhost/helloworld 返回601 - 請求 localhost/world/helloworld 返回601 - 請求 localhost/helloWorld 返回602
所以同時(shí)正則匹配時(shí)
- 放在前面的優(yōu)先匹配
- 注意如果不區(qū)分大小寫時(shí),使用 ~*
- 盡量將精確匹配的放在前面
測試示例3:
location ^~ /hello/ {
return 601;
}
location /hello/world {
return 602;
}
這種場景中,存在一個(gè)沒有符合的路由規(guī)則,那么實(shí)際的測試是怎樣呢?
- http://localhost/hello/wor 返回601 - http://localhost/hello/world 返回602 - http://localhost/hello/world23 返回602 - http://localhost/hello/world/123 返回602
從上面的示例可以看出
- 沒有符合時(shí),全匹配是優(yōu)先 ^~ 的
2) [uri]
這里主要填的是需要匹配的 path 路徑,根據(jù)前面的符號,這里可以填寫精確到 path 路徑,也可以填正則表達(dá)式,下面則主要針對正則進(jìn)行說明
- . : 匹配除換行符以外的任意字符
- ? : 重復(fù)0次或1次
- + : 重復(fù)1次或更多次
- * : 重復(fù)0次或更多次
- \d :匹配數(shù)字
- ^ : 匹配字符串的開始
- $ : 匹配字符串的介紹
- {n} : 重復(fù)n次
- {n,} : 重復(fù)n次或更多次
- [c] : 匹配單個(gè)字符c
- [a-z] : 匹配a-z小寫字母的任意一個(gè)
- 小括號()之間匹配的內(nèi)容,可以在后面通過$1來引用,$2表示的是前面第二個(gè)()里的內(nèi)容。正則里面容易讓人困惑的是\轉(zhuǎn)義特殊字符。
路由轉(zhuǎn)發(fā)
請求 path 匹配只是第一步,匹配完成之后,如何將請求轉(zhuǎn)發(fā)給其它的 web 服務(wù)呢?
1、反向代理
通??梢姷囊环N使用姿勢就是使用 nginx 代理請求,轉(zhuǎn)發(fā)到內(nèi)部的其它 web 服務(wù)上
主要通過 prixy_pass 來實(shí)現(xiàn)
location ^~ /webs {
proxy_pass http://127.0.0.1:8080/webs;
}
上面規(guī)則的含義是,將所有以 webs 開頭的請求,轉(zhuǎn)發(fā)到 8080 端口的 web 服務(wù)上。
上面是直接寫死轉(zhuǎn)發(fā)到一個(gè) ip 上,如果是多個(gè)機(jī)器提供服務(wù),可以這樣配置
## 下面放在http的括號內(nèi),作為第一層
upstream test.online {
server 120.11.11.11:8080 weight=1;
server 120.11.11.12:8080 weight=1;
}
location ^~ /webs {
proxy_pass http://test.online;
proxy_redirect default;
}
2、Rewrite 命令
rewrite功能就是,使用nginx提供的全局變量或自己設(shè)置的變量,結(jié)合正則表達(dá)式和標(biāo)志位實(shí)現(xiàn)url重寫以及重定向。
rewrite只能放在server{},location{},if{}中,并且只能對域名后邊的除去傳遞的參數(shù)外的字符串起作用, 如
http://jb51.net/a/we/index.php?id=1&u=str
只對/a/we/index.php重寫。
語法: rewrite regex replacement [flag];
示例:
location ^~ /hexo {
root '/Users/yihui/GitHub/';
}
location ~ /hello {
rewrite ^(/hello).*$ /hexo/public/index.html last;
return 603;
}
將hello開頭的,全部轉(zhuǎn)發(fā)到/hexo/public/index.html
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Nginx反向代理location和proxy_pass配置規(guī)則詳細(xì)總結(jié)
- Nginx的location的常見規(guī)則優(yōu)先級問題
- nginx 配置location匹配規(guī)則實(shí)例講解
- Nginx Location指令URI匹配規(guī)則詳解小結(jié)
- nginx配置location總結(jié)location正則寫法及rewrite規(guī)則寫法
- 詳解nginx配置location總結(jié)及rewrite規(guī)則寫法
- 詳解Nginx location 匹配規(guī)則
- Nginx服務(wù)器的location指令匹配規(guī)則詳解
- nginx中的路徑匹配location規(guī)則詳解
相關(guān)文章
Nginx配置負(fù)載均衡時(shí)訪問地址無法生效的解決方法
本文主要介紹了Nginx配置負(fù)載均衡時(shí)訪問地址無法生效的解決方法,例如負(fù)載均衡策略的設(shè)置是否正確、是否存在拼寫錯(cuò)誤等,下面就來詳細(xì)的介紹一下,感興趣的可以了解一下2023-09-09
Nginx location 和 proxy_pass路徑配置問題小結(jié)
本文是基于 location 的匹配末尾是否配置 / 和 proxy_pass 末尾是否配置 / ,進(jìn)行測試,完全還原了整個(gè)測試過程,本文給大家介紹Nginx location 基本配置及相關(guān)配置文件,感興趣的朋友跟隨小編一起看看吧2021-09-09
開發(fā)環(huán)境服務(wù)器vs生產(chǎn)環(huán)境服務(wù)器:開發(fā)與生產(chǎn)須分明詳解
開發(fā)環(huán)境服務(wù)器(如Vite)和生產(chǎn)環(huán)境服務(wù)器(如Nginx和Node.js)在職責(zé)和工作方式上存在顯著差異,開發(fā)環(huán)境服務(wù)器專注于快速開發(fā)和調(diào)試,而生產(chǎn)環(huán)境服務(wù)器則強(qiáng)調(diào)穩(wěn)定性和高并發(fā)處理,Vite適合開發(fā)環(huán)境,而Nginx和Node.js更適合生產(chǎn)環(huán)境2025-01-01
Nginx Proxy Manager輕松搭建反向代理的實(shí)現(xiàn)
NginxProxyManager是一款開源的反向代理和SSL證書管理工具,本文主要介紹了Nginx Proxy Manager輕松搭建反向代理的實(shí)現(xiàn),感興趣的可以了解一下2025-02-02
阿里云Nginx配置https實(shí)現(xiàn)域名訪問項(xiàng)目(圖文教程)
這篇文章主要介紹了阿里云Nginx配置https實(shí)現(xiàn)域名訪問項(xiàng)目(圖文教程),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Nginx反向代理基本設(shè)置的21個(gè)指令詳解
這篇文章主要介紹了Nginx反向代理基本設(shè)置的21個(gè)指令,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06

