1. 程式人生 > >nginx location配置小結

nginx location配置小結

location 語法:location [=|\~|\~*|^~|@] /uri/ { … }
預設:否
上下文:server
這個指令隨URL不同而接受不同的結構,既可以配置常規字串也可以使用正則表示式。如果使用正則表示式,必須使用\~*或者是\~作為字首,兩者的區別是\~*不區分大小寫,~是區分大小寫的。

那麼多的location,判定的順序是什麼呢?

  1. 先匹配普通的location,然後再匹配正則表示式。
  2. 普通的location之間,匹配最大字首。因為location不是“嚴格匹配”而是“字首匹配”,就會產生一個HTTP請求可以“字首匹配”到多個location,舉例來說:如果HTTP請求/prefix/mid/t.html,location /prefix/mid/ {} 和location /prefix/ {}都滿足匹配要求,選哪個呢?使用最大字首匹配,使用location /prefix/mid/ {}。
  3. 正則location匹配的時候,按照配置檔案的先後順序進行匹配,並且只要匹配到一條正則location就不考慮後面的。
  4. 匹配完了普通的location之後,會形成一個臨時結果,然後繼續正則匹配,,如果有匹配上的,就會“覆蓋”之前臨時的結果;正則location裡如果沒有匹配的上的,就使用最大字首匹配的結果。
  5. 通常的規則是匹配完了普通location之後,再去匹配正則location,能不能直接匹配完了普通location之後,不再匹配正則location了?可以使用“\^\~”或者“=”實現,^表示非,\~表示正則,使用“\^\~”作為字首的意思就是不用繼續匹配正則,並且“\^\~”依然遵守最大字首匹配規則;“=”則是必須嚴格匹配。
  6. 前面說到可以使用“\^\~”或者“=”阻止正則location的搜尋,其實還有一種“隱含”的方式,那就是location的配置精確到直接匹配,比如說當前的配置為location /exact/match/test.html {配置指令塊1},那麼當我們請求GET /exact/match/test.html,就會匹配到指令塊1,不再繼續搜尋!(還未驗證!)

順便說一下“location / {}”和“location = / {}”的區別,“location / {}”遵守普通location最大字首匹配,因為任何URI都必然以“/”根開頭,所以能匹配任何URI,如果有更具體的location就選具體的,如果沒有,“location / {}”也能起到一個保底的作用;“location = / {}”遵守的是嚴格精確匹配,也就是智慧匹配

http://host:port/請求,同時會禁止繼續搜尋正則location。如果我們只想對“GET /”請求配置作用指令,那麼我們可以使用“location = / {}”減少正則location的搜尋,提高效率。

To summarize, the order in which directives are checked is as follows:

  1. Directives with the “=” prefix that match the query exactly. If found, searching stops.
  2. All remaining directives with conventional strings. If this match used the “^~” prefix, searching stops.
  3. Regular expressions, in the order they are defined in the configuration file.
  4. If #3 yielded a match, that result is used. Otherwise, the match from #2 is used.

翻譯過來就是:
1. = 字首的指令嚴格匹配這個查詢。如果找到,停止搜尋;
2. 剩下的常規字串,長的在前。如果這個匹配使用 ^~ 字首,搜尋停止;
3. 正則表示式,按配置檔案裡的順序;
4. 如果第三步產生匹配,則使用這個結果。否則使用第二步的匹配結果。

配置舉例:

location = / {
# 只匹配/查詢。
[ configuration A ]
}
location / {
# 匹配任何查詢,因為所有請求都以/開頭。但是正則表示式規則和長的塊規則將被優先和查詢匹配。
[ configuration B ]
}
location ^~ /images/ {
# 匹配任何已 /images/ 開頭的任何查詢並且停止搜尋。任何正則表示式將不會被測試。
[ configuration C ]
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配任何已 gif、jpg 或 jpeg 結尾的請求。然而所有 /images/ 目錄的請求將使用 Configuration C。
[ configuration D ]
}

請求舉例:

/ -> configuration A
/documents/document.html -> configuration B
/images/1.gif -> configuration C
/documents/1.jpg -> configuration D

注意:按任意順序定義這4個配置結果將仍然一樣

參考資料: 關於一些對location認識的誤區
官方文件解釋:http://wiki.nginx.org/NginxHttpCoreModule#location