溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Nginx的Location匹配優(yōu)先級是什么

發(fā)布時間:2021-11-03 17:07:35 來源:億速云 閱讀:245 作者:柒染 欄目:建站服務(wù)器

這篇文章給大家介紹Nginx的Location匹配優(yōu)先級是什么,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

Nginx的配置文件中的Location用于匹配特定的URI,如果location后面的規(guī)則匹配了URI,并且匹配在此處停止向后匹配,則應(yīng)用該location下面的規(guī)則,反之繼續(xù)進(jìn)行匹配,直到匹配到相應(yīng)的規(guī)則或匹配到默認(rèn)的規(guī)則。

這里單就location的定位進(jìn)行討論,其它的部分不進(jìn)行解析。

解決的問題:

location為什么重要?

location 相當(dāng)于選擇,選中。當(dāng)我們處理某件事情,往往必須選中,然后再進(jìn)行進(jìn)一步的動作。比如處理word時,對某段文字應(yīng)用字體,肯定是先選中,然后再應(yīng)用規(guī)則。location就是這個意思,選擇的對象就是URI,根據(jù)不同的URI,使用不同的規(guī)則,location就是第一步,只有這一步正確,其余的部分才能保證順利進(jìn)行。

location該如何配置?

  1. location的幾種匹配方式

普通匹配

location = URI { configuration } #精確匹配

location ^~ URI { configuration } #非正則匹配

location [space] URI { configuration} # # 前綴匹配

正則匹配

location ~ URI { configuration } #大小寫敏感匹配

location ~* URI { configuration } #大小寫不敏感匹配

  1. 幾種匹配方式的優(yōu)先級

整體規(guī)則按照先普通匹配,然后再正則匹配,如果正則不匹配,則回退至上一個普通匹配。其中普通匹配沒有順序之分,哪個匹配最精確,就使用哪個location,正則匹配按照規(guī)則的書寫順序進(jìn)行。

= 精確匹配,匹配后停止后續(xù)匹配,直接執(zhí)行該匹配后的configuration.

[空格] 前綴匹配,匹配后,繼續(xù)更長前綴匹配和正則匹配。

^~ 非正則匹配,匹配該規(guī)則后,停止繼續(xù)正則匹配。

~ 區(qū)分大小寫的正則匹配,按順序匹配,一旦匹配上即停止后續(xù)匹配。

~* 不區(qū)分大小寫的匹配,一旦匹配即停止后續(xù)匹配。

  1. 幾種匹配規(guī)則的相同點(diǎn)和不同點(diǎn)

首先對幾種匹配符號進(jìn)行編號:

符號
編號
=
1
空格
2
^~
3
~
4
~*
5

1 vs 2
      相同點(diǎn): 2的特殊情況(隱式精確匹配)會等于1 

不同點(diǎn): 1匹配后停止后續(xù)的正則匹配,2 匹配后還要看有沒有更長的前綴可以匹配,和有沒有后續(xù)的正則匹配。

1 vs 3
        相同點(diǎn):都停止后續(xù)的正則匹配,即即使有正則表達(dá)式可以匹配的上,也不會匹配。
        不同點(diǎn): 3 匹配后還要繼續(xù)進(jìn)行最大前綴匹配,如果有更精確的匹配可以用,就使用該條匹配。

1 和 4 5 是兩類不同的匹配方式,匹配了1 就意味著,45都忽略。

2 vs 3 :
        相同點(diǎn):匹配后都執(zhí)行最大前綴匹配,
        不同點(diǎn): 2 進(jìn)行最大前綴匹配后還要進(jìn)行正則匹配,3 匹配后停止正則匹配。

        示例:
        如果URI相同,則location [] /test 和 location ^~ /test  相同,報錯如下:
        nginx: [emerg] duplicate location "/test" in /data/nginx/conf/nginx.conf:42
        由此可見, ^~ 和 空格 在URI相同的情況下,是同樣的意思,所以報如上錯誤。


演示:

在以下路徑中

/data/nginx/zzp/exact/

/data/nginx/zzp/regex/

創(chuàng)建同名但不同內(nèi)容的文件,然后使用curl -v http://host/a.html

發(fā)現(xiàn),正則表達(dá)式部分會生效,由此證明,經(jīng)過普通匹配后的URI,再繼續(xù)進(jìn)行regex匹配,regex匹配上之后,regex生效。

location  /zzp/ {

            alias /data/nginx/zzp/exact/;

        }

location ~ ^/zzp/(.*\.html)$ {

        alias /data/nginx/zzp/regex/$1;

}

使用取消正則表達(dá)式符號 ^~,然后再請求相同的鏈接,發(fā)現(xiàn)exact路徑下的文件被訪問,證明,普通匹配執(zhí)行后不再進(jìn)行正則表達(dá)式匹配。

location ^~ /zzp/ {

            alias /data/nginx/zzp/exact/;

        }

location ~ ^/zzp/(.*\.html)$ {

            alias /data/nginx/zzp/regex/$1;

}

關(guān)于Nginx的Location匹配優(yōu)先級是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI