Nginx?Location匹配規(guī)則的具體使用
1. 語法基礎(chǔ)
Nginx 的 location
指令的基本語法如下:
location [=|~|~*|^~|@] uri { ... }
=
表示精確匹配。~
表示區(qū)分大小寫的正則匹配。~*
表示不區(qū)分大小寫的正則匹配。^~
表示非正則匹配,如果該選項匹配,則不再進行正則匹配。( ^ 表示“非”,~ 表示“正則”,字符意思是:不會繼續(xù)匹配正則)@
定義一個命名的 location,通常用于內(nèi)部重定向。
2. 匹配規(guī)則
Nginx 對多個 location 的匹配遵循一定的規(guī)則和優(yōu)先級。當 Nginx 收到一個請求時,它會按照以下順序進行匹配
2.1 精確匹配(=)
優(yōu)先級最高。當請求的URI與location
后面的字符串完全相同時,Nginx會選擇這個location
塊進行處理。(這個好理解,就是路徑完全匹配,一模一樣,優(yōu)先級最高)
示例:
location = /favicon.ico { # 處理/favicon.ico的請求 }
只有當請求URI嚴格為/favicon.ico
時,上述location
塊才會被使用。
2.2. 最長前綴匹配(^~)
以^~
開頭的location
表示最長前綴匹配。如果請求的URI以某個location
后面的字符串開頭,并且這個字符串是最長的(或者使用了^~
修飾符),Nginx會選擇這個location
塊。但請注意,^~
修飾符實際上會停止后續(xù)的正則匹配搜索。(最長前綴匹配,意思就是以location后面的字符開始的且最長匹配,有的地方叫做非正則匹配,意思是滿足了最長前綴匹配,就不會再匹配正則匹配了,也可以理解為即滿足最長前綴匹配,也滿足正則匹配,就匹配最長前綴匹配,也就是所說的最長前綴匹配優(yōu)先級高于正則匹配,所謂的優(yōu)先級是兩者或多著都匹配的情況下,才會顯現(xiàn)優(yōu)先級)
示例:
location ^~ /hello { return 601; } location ^~ /hellow { return 602; } location ^~ /hello/world { return 603; } location ~ /hello { return 604; }
對于請求/hello
,滿足 601和 604,實際返回601,就是因為^~優(yōu)先級高于正則匹配;
對于請求/hellow
,滿足 601和 602,實際返回602,因為最長前綴匹配原則;
2.3. 正則表達式匹配(~和~*)
正則表達式匹配允許定義更復雜的URI匹配模式。~
表示區(qū)分大小寫的正則匹配,而~*
表示不區(qū)分大小寫的正則匹配。
Nginx會按照配置文件中的順序逐個檢查正則表達式location
塊,直到找到第一個匹配的塊。因此,正則表達式的順序很重要。
示例:
location ~ \.(gif|jpg|png)$ { # 處理以.gif、.jpg或.png結(jié)尾的請求(區(qū)分大小寫) } location ~* \.(GIF|JPG|PNG)$ { # 處理以.GIF、.JPG或.PNG結(jié)尾的請求(不區(qū)分大小寫) }
對于請求/images/photo.jpg
,第一個location
塊將被匹配(如果請求是區(qū)分大小寫的)。
2.4. 普通前綴匹配(無修飾符)
普通前綴匹配也按照配置文件中出現(xiàn)的先后順序進行匹配,先出現(xiàn)的location
指令優(yōu)先匹配。
示例:
location /hello { return 601; } location /hellow { return 602; }
對于請求/hellow
,滿足 601和 602,實際返回602,證明滿足長前綴匹配原則
再增加一項配置 ``` location ~ /hello[a-z] { return 603; } ```
對于請求/hellow
,滿足 601、 602和603,實際返回603,證明正則匹配優(yōu)先級高于普通匹配
2.5. 默認匹配(/)
如果請求的URI與任何特定的location
塊都不匹配,Nginx將使用默認的location
塊(如果有的話)。通常,默認的location
塊是一個不帶任何修飾符的location /
塊。
示例:
location / { # 處理所有其他請求 }
綜上所述
Nginx的location
匹配規(guī)則優(yōu)先級可以總結(jié)為:
- 精確匹配(
=
) - 最長前綴匹配(
^~
),但會停止后續(xù)的正則匹配搜索 - 正則表達式匹配(
~
和~*
),按配置順序 - 普通前綴匹配(無修飾符),也按配置順序
- 默認匹配(
/
)
3. 注意事項
- 正則匹配與順序:正則
location
的匹配順序很重要,因為 Nginx 會按照配置文件中定義的順序進行匹配。 proxy_pass
的路徑替換:在配置proxy_pass
時,需要注意location
后面的 URI 是否包含斜杠(/
),這會影響請求的轉(zhuǎn)發(fā)路徑。通常建議location
和proxy_pass
要么都加斜杠,要么都不加。- 性能優(yōu)化:將精確匹配放在前面,可以減少不必要的正則匹配,提高 Nginx 的處理效率。
4. 常見的正則符號
符號 | 描述 | 示例 |
---|---|---|
^ | 匹配字符串的開始位置 | ^http 匹配以"http"開頭的字符串 |
$ | 匹配字符串的結(jié)束位置 | \.com$ 匹配以".com"結(jié)尾的字符串 |
. | 匹配除換行符以外的任意單個字符 | a.c 匹配"abc"、"a1c"等 |
* | 匹配前面的子表達式零次或多次 | ab*c 匹配"ac"、“abc”、"abbc"等 |
+ | 匹配前面的子表達式一次或多次 | ab+c 匹配"abc"、“abbc”、“abbbc"等,但不匹配"ac” |
? | 匹配前面的子表達式零次或一次 | ab?c 匹配"ac"、“abc” |
| | 或匹配模式,匹配左邊的表達式或右邊的表達式 | (jpg|gif|png) 匹配"jpg"、“gif"或"png” |
\ | 轉(zhuǎn)義字符,用于匹配特殊字符 | \. 匹配"."字符本身 |
[ ] | 字符集合,匹配集合中的任意單個字符 | [a-z] 匹配任意小寫字母 |
[^ ] | 反向字符集合,匹配不在集合中的任意單個字符 | [^a-z] 匹配任意非小寫字母 |
{n} | n 是一個非負整數(shù),匹配確定的 n 次 | o{2} 匹配"oo" |
{n,} | n 是一個非負整數(shù),至少匹配 n 次 | o{2,} 匹配"oo"、“ooo”、"oooo"等 |
{n,m} | n 和 m 均為非負整數(shù),其中n <= m,匹配至少 n 次,但不超過 m 次 | o{2,4} 匹配"oo"、“ooo”、“oooo” |
到此這篇關(guān)于Nginx Location匹配規(guī)則的文章就介紹到這了,更多相關(guān)Nginx Location匹配規(guī)則內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx實現(xiàn)動態(tài)封禁IP的設(shè)計方案
為了封禁某些爬蟲或者惡意用戶對服務(wù)器的請求,我們需要建立一個動態(tài)的 IP 黑名單,對于黑名單中的 IP ,我們將拒絕提供服務(wù),并且可以設(shè)置封禁失效時間,所以本文給大家介紹了Nginx實現(xiàn)動態(tài)封禁IP的設(shè)計方案,需要的朋友可以參考下2024-12-12nginx反向代理https內(nèi)部定向到http報302的問題及解決
這篇文章主要介紹了nginx反向代理https內(nèi)部定向到http報302的問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12