網(wǎng)站上用nginx非常廣泛, 但是它的配置文件比較復(fù)雜, 這里討論下nginx的location匹配規(guī)則.
約定熟成: []表示里面的參數(shù)能省略, <>表示里面的參數(shù)不能省略.
location的兩種語(yǔ)法
第一種語(yǔ)法分為3個(gè)部分, 分別是: location關(guān)鍵字+@name別名(name是自己取的名字)+如何處理, 這個(gè)語(yǔ)法很簡(jiǎn)單, 就是做內(nèi)部跳轉(zhuǎn), 這里不討論了.
location @name { ... }第二種語(yǔ)法分為4個(gè)部分, 分別是: location關(guān)鍵字 + 匹配方式符號(hào)(可省略)+匹配規(guī)則+如何處理, 這個(gè)最復(fù)雜也是最常用, 我們只討論這個(gè).
location [ = | ~ | ~* | ^~ ] uri { ... }普通匹配和正則匹配
這個(gè)語(yǔ)法的難點(diǎn)全部集中在[ = | ~ | ~* | ^~ ]這里, 只要搞懂這個(gè)就能正確使用location.
[ = | ~ | ~* | ^~ ]分為兩種匹配模式, 分別是普通匹配和正則匹配.
普通匹配概述
=: 這代表精準(zhǔn)匹配全路徑, 命中它后直接返回, 不再進(jìn)行后續(xù)匹配, 優(yōu)先級(jí)最高.^~: 這代表精準(zhǔn)匹配開頭, 命中開頭后直接返回, 不再進(jìn)行后續(xù)匹配, 優(yōu)先級(jí)第二.無(wú)匹配方式符號(hào): 這代表通用性匹配, 命中后還會(huì)繼續(xù)后續(xù)匹配, 最后選取路徑最長(zhǎng)的匹配, 并儲(chǔ)存起來(lái), 優(yōu)先級(jí)第四.
普通匹配舉例
#這是精準(zhǔn)匹配, 只有請(qǐng)求路徑完全匹配`/index.html`才會(huì)命中它location = /index.html { ...}#這是精準(zhǔn)匹配開頭, 只要請(qǐng)求路徑的開頭是`/image/`, 就會(huì)命中并立即返回location ^~ /image/ { ...}#這是無(wú)匹配方式符號(hào)的普通匹配, 如果請(qǐng)求路徑開頭是`/image/`, 則會(huì)命中, 但是不會(huì)立即返回還會(huì)接著進(jìn)行普通匹配location /image/ { ...}#這是無(wú)匹配方式符號(hào)的普通匹配, 如果請(qǐng)求路徑開頭是`/image/meinv`, 則會(huì)命中, 但是不會(huì)立即返回還會(huì)接著進(jìn)行普通匹配, 同時(shí)會(huì)舍棄掉上面那個(gè)匹配location /image/meinv { ...}正則匹配概述
~: 這是區(qū)分大小寫的正則匹配, 命中后則不進(jìn)行后續(xù)匹配, 立即返回, 優(yōu)先級(jí)第三.*~: 不區(qū)分大小寫的正則匹配, 命中后則不進(jìn)行后續(xù)匹配, 立即返回, 優(yōu)先級(jí)第三.
這里有個(gè)很重要點(diǎn)點(diǎn), 也就是正則匹配中~和*~優(yōu)先級(jí)一樣, 它們按照從上到下的順序進(jìn)行匹配, 最先命中的立即返回, 后續(xù)的不會(huì)進(jìn)行匹配, 所以精細(xì)的正則匹配規(guī)則往前放, 通用的正則匹配規(guī)則往后放.
正則匹配舉例
#區(qū)分大小寫的正則匹配, 如果路徑包含 /image/ 則立即返回, 注意這里并不需要開頭命中, 因?yàn)檫@是正則表達(dá)式location ~ /image/ { ...}#區(qū)分大小寫的正則匹配, 如果路徑包含 /image(不分大小寫)/ 則立即返回, 注意這里并不需要開頭命中, 因?yàn)檫@是正則表達(dá)式, 但由于上面一個(gè)正則匹配規(guī)則在前面, 所以如果路徑包含 /image/ 則會(huì)被擋下來(lái), 匹配不到這里.location *~ /IMAGE/ { ... }location如何匹配?
先進(jìn)行普通匹配中的精準(zhǔn)匹配, 如果命中了立馬返回.
然后進(jìn)行普通匹配中的精準(zhǔn)開頭匹配, 如果命中則立馬返回.
進(jìn)行普通匹配中的 無(wú)匹配符號(hào) 匹配, 如果命中繼續(xù)匹配, 知道普通匹配全部完成, 并保存路徑最長(zhǎng)的匹配.
由上自下進(jìn)行正則匹配, 如果命中立即返回.
如果正則匹配全部失敗, 則返回普通匹配中存放的匹配.
文章首發(fā)于: https://hedaoshe.com/312.html