高效能Web伺服器Nginx的配置與部署研究(16)小議location匹配模式優先順序

鍾超發表於2012-06-20

高效能Web伺服器Nginx的配置與部署研究(16)小議location匹配模式優先順序

  • Author: 柳大·Poechant(鍾超)
  • Email: zhongchao.ustc#gmail.com(#->@)
  • Blog:Blog.CSDN.net/Poechant
  • Date: June 20th, 2012

1 location 的匹配符

1.1 等於匹配符:=

等於匹配符就是等號,特點可以概括為兩點:

  1. 精確匹配
  2. 不支援正規表示式

1.2 空匹配符

空匹配符的特點是:

  1. 匹配以指定模式開始的 URI
  2. 不支援正規表示式

1.3 正則匹配符:~

正則匹配符是可以使用正規表示式的匹配符。不過這裡要強調的是,一般來說~是指:

區分大小寫的正則匹配

~*表示:

不區分大小寫的正則匹配

但是對於一些對大小寫不敏感的作業系統,這兩者沒有區別。另外一個就是^~,其表示以指定模式開始的正則匹配。

1.4 內部訪問符:@

一般用於錯誤頁面等,這個暫不討論。

2 匹配符優先順序

  1. =
  2. 空匹配符,滿足精確匹配時
  3. ^~
  4. ~~*
  5. 空匹配符,滿足以指定模式開始時的匹配時

這樣說比較抽象,我們來看例子吧。

2.1 等於匹配符與精確匹配時的空匹配符

看下面的例子(用到我們此前一起完成的Hello World模組):

location /poechant {
    hello_world no1;
}

location = /poechant {
    hello_world no2;
}

如果我們的請求是http://my.domian/poechant,則我們發現兩個location都與請求的 URI 匹配,這時根據我們的優先順序順序,第一個是精確匹配時的空匹配符,第二個是等於匹配符,所以第二個的優先順序高,也就是應該輸出:

hello_world, no2

同時也說明 Nginx 的 locatoin 不是按照配置檔案中的書寫順序來匹配的。

2.2 精確匹配時的空匹配符與正則匹配的^~

下面這個例子中,兩者開始都精確匹配了,連這個正則匹配都是精確匹配。

location ^~ ^/poechant$ {
    hello_world no1;
}

location /poechant {
    hello_world no2;
}

匹配哪一個?你測試一下,會得到:

hello_world, no2

與我們上面說的優先順序順序相吻合。

2.3 其他匹配優先順序比較的例項

-

柳大·Poechant:Blog.CSDN.net/Poechant

-

相關文章