徹底弄懂nginx的location匹配規(guī)則

網(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

    ?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
    【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
    平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

    相關(guān)閱讀更多精彩內(nèi)容

    友情鏈接更多精彩內(nèi)容