nginx 注意事項

wang_0720發表於2013-11-19
nginx使用花括號{}判斷區塊,所以當正則中包含花括號時,則必須用雙引號將正則包起來
location是nginx用來處理對同一個server不同的請求地址使用獨立的配置的方式
舉例:
location = / {
    #只匹配“/”
    ... 配置A
}

location / {
     #匹配任何請求,因為所有請求都是以“/”開始
     #但更長字元匹配或正規表示式匹配會優先匹配
    ...配置B
}

location ^~ /images/ {
    #匹配任何以/images/開始的請求,並停止匹配其他location
    ...配置C
}

location ~* .(gif|jpg|jpeg)$ {
    #匹配以gif,jpg,jpeg結尾的請求,但是所有/images/目錄的請求由C處理
    ...配置D
}
訪問 / 會使用配置A
訪問 /documents/document.html 會使用配置B
訪問 /images/1.gif 會使用配置C
訪問 /documents/1.jpg 會使用配置D

sever區塊中如果有包含rewrite規則,則會最先執行,而且只會執行一次, 然後再判斷命中哪個location的配置,再去執行該location中的rewrite, 當該location中的rewrite執行完畢時,rewrite並不會停止,而是根據rewrite過的URL再次判斷location並執行其中的 配置. 那麼,這裡就存在一個問題,如果rewrite寫的不正確的話,是會在location區塊間造成無限迴圈的.所以nginx才會加一個最多重試10次的 上限

locatoin並非像rewrite那樣逐條執行,而是有著匹配優先順序的,當一條請求同時滿足幾個location的匹配時,其只會選擇其一的配置執行.
其尋找的方法為:
    1. 首先尋找所有的常量匹配,如location /, location /av/, 以相對路徑自左向右匹配,匹配長度最高的會被使用,
    2. 然後按照配置檔案中出現的順序依次測試正規表示式,如 location ~ download\/$, location ~* \.wtf, 第一個匹配會被使用
    3. 如果沒有匹配的正則,則使用之前的常量匹配

而下面幾種方法當匹配時會立即終止其他location的嘗試
    1. = 完全匹配,location = /download/
    2. ^~ 終止正則測試,如location ^~ /download/ 如果這條是最長匹配,則終止正則測試,這個符號只能匹配常量
    3. 在沒有=或者^~的情況下,如果常量完全匹配,也會立即終止測試,比如請求為 /download/ 會完全命中location /download/而不繼續其他的正則測試
總結:
    1. 如果完全匹配(不管有沒有=),嘗試會立即終止
    2. 以最長匹配測試各個常量,如果常量匹配並有 ^~, 嘗試會終止
    3. 按在配置檔案中出現的順序測試各個正規表示式
    4. 如果第3步有命中,則使用其匹配location,否則使用第2步的location
另外還可以定義一種特殊的named location,以@開頭,如location @thisissparta 不過這種location定義不用於一般的處理,而是專門用於try_file, error_page的處理,這裡不再深入.
 用前文的例子來看看

location  = / {
  ....配置A
}
 
location  / {
  ....配置B
}
 
location ^~ /images/ {
  ....配置C
}
 
location ~* \.(gif|jpg|jpeg)$ {
  ....配置D
}

訪問 / 會使用配置A -> 完全命中
訪問 /documents/document.html 會使用配置B -> 匹配常量B,不匹配正則C和D,所以用B
訪問 /images/1.gif 會使用配置C -> 匹配常量B,匹配正則C,使用首個命中的正則,所以用C
訪問 /documents/1.jpg 會使用配置D -> 匹配常量B,不匹配正則C,匹配正則D,使用首個命中的正則,所以用D

last和break最大的不同在於

- break是終止當前location的rewrite檢測,而且不再進行location匹配
- last是終止當前location的rewrite檢測,但會繼續重試location匹配並處理區塊中的rewrite規則


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27181165/viewspace-776955/,如需轉載,請註明出處,否則將追究法律責任。

相關文章