Nginx location匹配規則小記

2021-10-10 01:54:33 字數 3621 閱讀 6793

官網參考鏈結

表示符號

符號說明

=表示精確匹配,只有完全匹配上才能生效

^~表示uri以某個常規字串開頭

~正則匹配(區分大小寫)

~*正則 (不區分大小寫)

! ~區分大小寫不匹配的正則

! ~ *

不區分大小寫不匹配的正則

/任何請求都會匹配

1> 匹配=,如果匹配成功,則停止其他匹配 (先進行字首匹配,再進行正則匹配)

2> 普通字串的匹配,和其在配置檔案中的順序無關,而是與匹配的長短有關,如果匹配成功的 location 使用了 ^~ ,則停止匹配,否則進行正則匹配(如果正則匹配成功,則使用正則匹配的結果,如果正則匹配不成功,則使用此處匹配的結果) ^~ 若最長字首匹配含有前面這個字元,則終止後面的正則匹配

3> 正則匹配,按照正則匹配在配置檔案**現的順序,成功則停止匹配

4> 以上都沒匹配成功,則使用 / 萬用字元匹配

5> 有時候為了避免匹配成功的普通字串再繼續進行正則匹配,會使用 ^~ 符號

6> 在字首匹配中,尋找並記錄最長字首匹配(兩個location,/abc和/abc/def 那麼帶uri/abc/def/a.jpg的請求匹配的最長字首就是/abc/def)

順序 no優先順序:

(location =) > (location 完整路徑) > (location ^~ 路徑) > (location ~ , ~* 正則順序) > (location 部分起始路徑) > (/)

# 因為所有的位址都以 / 開頭,所以這條規則將匹配到所有請求

# 但是正則和最長字串會優先匹配

location /

# 匹配任何以 /doc/ 開頭的位址,匹配符合以後,還要繼續往下搜尋

# 只有後面的正規表示式沒有匹配到時,這一條才會採用這一條

location /doc/

# 匹配任何以 /doc/ 開頭的位址,匹配符合以後,還要繼續往下搜尋

# 只有後面的正規表示式沒有匹配到時,這一條才會採用這一條

location ~ /doc/abc

# 匹配任何以 /images/ 開頭的位址,匹配符合以後,停止往下搜尋正則,採用這一條。

location ^~ /image/

# 匹配所有以 gif,jpg或jpeg 結尾的請求 不區分大小寫

# 然而,所有請求 /images/ 下的會被 config e 處理,因為 ^~ 到達不了這一條正則

# 最長字元匹配到 /images/abc,繼續往下,會發現 ^~ 存在

# f與g的放置順序是沒有關係的

location /image/abc

location ~ /image/abc

} include /etc/nginx/conf.d/*.conf;

}

訪問根目錄http://localhost/ 將匹配規則a

訪問 http://localhost/doc 將匹配規則c,http://localhost/file(不是doc) 則匹配規則b

訪問 http://localhost/image/a.html 將匹配規則e

訪問 http://localhost/a.gif, http://localhost/b.jpg 將匹配規則f,而 http://localhost/image/c.png 則優先匹配到規則e

所以實際使用中,個人覺得至少有三個匹配規則定義,如下:

#直接匹配**根,通過網域名稱訪問**首頁比較頻繁,使用這個會加速處理,官網也如此

#這裡是直接**給後端應用伺服器了,也可以是乙個靜態首頁

# 第乙個必選規則

location = /

# 第二個必選規則是處理靜態檔案請求,這是nginx作為http伺服器的強項

# 有兩種配置模式,目錄匹配或字尾匹配,任選其一或搭配使用

#第三個規則就是通用規則,用來**動態請求到後端應用伺服器

#非靜態檔案請求就預設是動態請求,自己根據實際把握

#畢竟目前的一些框架的流行,帶.php,.jsp字尾的情況很少了

location /

location ^~ /helloworld 

#location /helloworld

location ~ /helloworld

訪問http://localhost/helloworld/test,返回601

如果將上面的塊注釋,中間的塊放開注釋,則返回603,因為匹配到普通字串沒有帶^~,會繼續進行正則匹配

location /helloworld/test/ 

location /helloworld/

普通字串的匹配和配置檔案中的順序無關,而是與匹配的長短有關。

訪問http://localhost/helloworld/test/a.html,返回601

http://localhost/helloworld/a.html,返回602

location /helloworld/test/ 

location ~ /helloworld

location ~ /helloworld/test

訪問http://localhost/helloworld/test/a.html,返回602

交換#2和#3調換順序

訪問http://localhost/helloworld/test/a.html,返回603

下面這兩種寫法的區別(html是nginx的預設訪問根目錄):

location /dir1/
location /dir1/
當訪問http://ip/dir1/1.html的時候,如果是第一種配置,則會在html/dir1目錄下找1.html檔案,

如果是第二種配置,則會在html/dir1/dir1目錄下找1.html檔案

root是在全目錄下繼續加上location的路徑

proxy_pass**的時候,下面兩種寫法的區別:

location /proxy/
location /proxy/
當訪問http://ip/proxy/1.html的時候,如果是第一種配置,則**訪問http://proxy_ip/proxy/1.html,

如果是第二種配置,則**訪問http://proxy_ip/1.html

nginx location匹配規則

location匹配命令 波浪線表示執行乙個正則匹配,區分大小寫 表示執行乙個正則匹配,不區分大小寫 表示普通字元匹配,不使用正規表示式,如果該選項匹配,只匹配該選項,不匹配別的選項,一般用來匹配目錄 進行普通字元精確匹配 定義乙個命名的 location,使用在內部定向時,例如 error pag...

nginx location匹配規則

location匹配命令 波浪線表示執行乙個正則匹配,區分大小寫 表示執行乙個正則匹配,不區分大小寫 表示普通字元匹配,如果該選項匹配,只匹配該選項,不匹配別的選項,一般用來匹配目錄 進行普通字元精確匹配 定義乙個命名的 location,使用在內部定向時,例如 error page,try fil...

nginx location匹配規則

location匹配命令 波浪線表示執行乙個正則匹配,區分大小寫 表示執行乙個正則匹配,不區分大小寫 表示普通字元匹配,如果該選項匹配,只匹配該選項,不匹配別的選項,一般用來匹配目錄 進行普通字元精確匹配 定義乙個命名的 location,使用在內部定向時,例如 error page,try fil...