Nginx Location配置難點(diǎn)

語(yǔ)法
location
syntax: location [=|||^~|@] /uri/ { ... }
其中 “~ ” 前綴表示匹配區(qū)分大小寫的正則 location鲸拥,“~
” 前綴表示匹配不區(qū)分大小寫的正則 location鸠项;其他前綴(包括:“=”茫孔,“^~ ”和“@ ”)和 無(wú)任何前綴的都屬于普通 location吸申,= 精確匹配掌挚,^~ 不使用正則翰苫,@ 內(nèi)部重定向囊嘉。

匹配順序
對(duì)于一個(gè)特定的 HTTP 請(qǐng)求,nginx 應(yīng)該匹配哪個(gè) location 塊的指令呢?

匹配規(guī)則是:先 匹 配 普 通 location 笛求,再 匹 配 正 則 表 達(dá) 式廊移。

對(duì)于匹配普通 location,有如下兩點(diǎn):
匹配 URI 的前綴部分
最大匹配原則
( 因?yàn)?location 不是 “嚴(yán)格匹配”探入,而是 “前綴匹配”画机,就會(huì)產(chǎn)生一個(gè) HTTP 請(qǐng)求,可以 “前綴匹配” 到多個(gè)普通 location新症,例如:location /prefix/mid/ {} 和 location /prefix/ {},對(duì)于請(qǐng)求 /prefix/mid/t.html响禽,前綴匹配的話兩個(gè) location 都滿足徒爹,選哪個(gè)?根據(jù)最大匹配原則 芋类,于是選的是 location /prefix/mid/ {} )

  1. 對(duì)于正則表達(dá)式的匹配:

通常的規(guī)則是匹配完了 “普通 location” 指令隆嗅,還需要繼續(xù)匹配 “正則 location”。
但是也可以告訴 nginx 匹配到了 “普通 location” 后侯繁,不再需要繼續(xù)匹配 “正則 ” 了胖喳。
要做到這一點(diǎn)只要在 “普通 location” 前面加上 “^~ ” 符號(hào)( ^ 表示 “非”,~ 表示 “正則”贮竟,意思是:不要繼續(xù)匹配正則 )丽焊。

除了 “^~ ” 可以阻止繼續(xù)搜索正則 location 外较剃,還可以加 “=”。

那么 “^~ ” 和 “=” 都能阻止繼續(xù)搜索正則 location 的話技健,那它們之間有什么區(qū)別呢写穴?

區(qū)別很簡(jiǎn)單:

共同點(diǎn)是它們都能阻止繼續(xù)搜索正則 location
不同點(diǎn)是 “^~ ” 依然遵守 “最大前綴” 匹配規(guī)則,然而 “=” 不是 “最大前綴”雌贱,而是嚴(yán)格匹配 ( exact match )
例如啊送,location / {} 和 location = / {} 的區(qū)別:

location / {} 遵守普通 location 的最大前綴匹配。
由于任何 URI 都必然以“/ ”根開頭欣孤,所以對(duì)于一個(gè) URI馋没,如果有更精確的匹配,那自然是選這個(gè)更精確的降传;如果沒(méi)有篷朵,“/ ” 一定能為這個(gè) URI 墊背( 至少能匹配到“/ ”)。
也就是說(shuō) location / {} 有點(diǎn)默認(rèn)配置的味道搬瑰,其他更精確的配置能覆蓋這個(gè)默認(rèn)配置( 這也是為什么我們總能看到 location / {} 這個(gè)配置的一個(gè)很重要的原因)款票。
location = / {}遵守的是 “嚴(yán)格精確匹配 exact match”。
也就是只能匹配對(duì)根目錄的請(qǐng)求泽论,同時(shí)會(huì)禁止繼續(xù)搜索 正則 location艾少。
如果我們只想對(duì) GET / 請(qǐng)求配置作用指令,那么我們可以選 location = / {} 翼悴。這樣能減少正則 location 的搜索缚够,因此效率比 location / {} 高。

普通 location 匹配完后鹦赎,還會(huì)繼續(xù)匹配正則 location谍椅;但是 nginx 允許阻止這種行為,方法很簡(jiǎn)單古话,只需要在普通 location 前加 “^~ ” 或 “=”雏吭。

但其實(shí)還有一種 “隱含” 的方式來(lái)阻止正則 location 的搜索。

這種隱含的方式就是:當(dāng) “最大前綴” 匹配恰好就是一個(gè)“嚴(yán)格精確 ( exact match )”匹配陪踩,照樣會(huì)停止后面的搜索杖们。

原文字面意思是:只要遇到 “精確匹配 exact match”,即使普通 location 沒(méi)有帶 “=” 或 “^~ ” 前綴肩狂,也一樣會(huì)終止后面的匹配摘完。

假設(shè)當(dāng)前配置是:location /exact/match/test.html { 配置指令塊1},location /prefix/ { 配置指令塊2} 和 location ~ .html$ { 配置指令塊3}

如果我們請(qǐng)求 GET /prefix/index.html 傻谁,則會(huì)被匹配到指令塊3 孝治,因?yàn)槠胀?location /prefix/ 依據(jù)最大匹配原則能匹配當(dāng)前請(qǐng)求,但是會(huì)被后面的正則 location 覆蓋;
當(dāng)請(qǐng)求 GET /exact/match/test.html 谈飒,會(huì)匹配到指令塊1 岂座,因?yàn)檫@個(gè)是普通 location 的 exact match ,會(huì)禁止繼續(xù)搜索正則 location步绸。
最后來(lái)看一個(gè)總結(jié)的栗子:

Example:
location = / {

matches the query / only.

[ configuration A ]
}
location / {

matches any query, since all queries begin with /, but regular

expressions and any longer conventional blocks will be

matched first.

[ configuration B ]
}
location ^~ /photos/ {
# matches any query beginning with /images/ and halts searching,

so regular expressions will not be checked.

[ configuration C ]
}
location ~* .(gif|jpg|jpeg)$ {

matches any request ending in gif, jpg, or jpeg. However, all

requests to the /images/ directory will be handled by

Configuration C.

[ configuration D ]
}

Example requests:
● / -> configuration A
● /production/document.html -> configuration B
● /photos/1.gif -> configuration C
● /production/1.jpg -> configuration D

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末掺逼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瓤介,更是在濱河造成了極大的恐慌吕喘,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刑桑,死亡現(xiàn)場(chǎng)離奇詭異氯质,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)祠斧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門闻察,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人琢锋,你說(shuō)我怎么就攤上這事辕漂。” “怎么了吴超?”我有些...
    開封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵钉嘹,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我鲸阻,道長(zhǎng)跋涣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任鸟悴,我火速辦了婚禮陈辱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘细诸。我一直安慰自己沛贪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開白布震贵。 她就那樣靜靜地躺著鹏浅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪屏歹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天之碗,我揣著相機(jī)與錄音蝙眶,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛幽纷,可吹牛的內(nèi)容都是我干的式塌。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼友浸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼峰尝!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起收恢,我...
    開封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤武学,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后伦意,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體火窒,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年驮肉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了熏矿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡离钝,死狀恐怖票编,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情卵渴,我是刑警寧澤慧域,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站奖恰,受9級(jí)特大地震影響吊趾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瑟啃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一论泛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蛹屿,春花似錦屁奏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至犹撒,卻和暖如春折联,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背识颊。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工诚镰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奕坟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓清笨,卻偏偏與公主長(zhǎng)得像月杉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抠艾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容