LOCATION BLOCK 匹配規則

#location 修飾符
location block匹配request url中domain name或者ip/port之後的請求部分,即請求資源的路徑。
location optional_modifier location_match {

    . . .

}
 
    location修飾符關聯的location將做如下解析:
 =  
請求的url必須嚴格匹配被location指定的路徑
none
如果沒有修飾符,將對url做前綴匹配
^~ 
最佳的非正則表達式前綴匹配
~   
大小寫敏感的正則匹配
~*
大小寫不敏感的正則匹配

#location匹配規則

    · nginx檢查所有基於前綴的匹配,對於一個完整的請求,nginx會檢查所有的前綴匹配
    · 首先,nginx會查找一個精確匹配。如果匹配到了 = modifier,匹配會立即終止,該location就會被選擇處理這個請求。
     · 如果沒有精確匹配(= modifier),nginx繼續進行前綴匹配,對於給定的url,選擇最長的前綴匹配。然後依據下列規則,繼續匹配。
    ·  如果最長的前綴匹配有(^~ modifier),nginx會立即結束查詢,選擇該location。
    ·  如果沒有 ^~ modifier,該匹配會被暫時存起來,以便搜索可以繼續。
    ·  最長的匹配被存起來後,nginx會繼續匹配正則表達式。nginx移動到 location list 的頂部,然後試着去匹配正則表達式,第一個被匹配的正則表達式會立即被選擇處理請求,結束匹配。
    ·  如果沒有正則表達式被匹配,則之前存儲的最長location被選擇用來處理請求。

    特別需要理解的:
    
    nginx正則匹配結果優先於前綴匹配。但是前綴匹配在先,同時允許通過 ^~ 和 = 來改變這種趨勢。

    前綴匹配一般選擇最長,最精確的匹配,而正則匹配在第一個匹配發現時,匹配就會終止。也就是說,正則匹配跟配置文件中規則的定義位置有很大關係。
    
#location內部跳轉規則

    · index指令
    如果精確匹配的結果是一個目錄,請求會 redirect 到其他 location。
    如果請求精確匹配到了 /exact,則該 location 會默認繼承 index directive , 然後內部跳轉到第二個 location處理。
index index.html;

location = /exact {
}

location / {
}

· try_files
    該指令讓 nginx 檢查一個文件,目錄是否存在。最後一個參數可以是一個url,用於 nginx 做內部跳轉使用。
root /var/www/main;
location / {
    try_files $uri $uri.html $uri/ /fallback/index.html;
}

location /fallback {
    root /var/www/another;
}
這個例子中如果請求的名字是/neojos, nginx會在root中查找一個叫neojos的文件,如果沒有找到,接下來查找一個neojos.html的文件,最後會查找在root下是否存在neojos/的目錄。如果全部查找失敗了,則會跳轉到 /fallback/index.html, 觸發下面的location處理。

· rewrite
    在rewrite指令中,使用 last 參數或則不加參數,nginx基於 rewrite 的結果,將會選擇一個新的 location處理。
root /var/www/main;
location / {
    rewrite ^/rewriteme/(.*)$ /$1 last;
    try_files $uri $uri.html $uri/ /fallback/index.html;
}

location /fallback {
    root /var/www/another;
}
如果請求是 /rewriteme/hello,將會在第一個 location 被重寫爲/hello。然後再被第一個 location 的 try_files處理,如果沒有查找到,則返回 /fallback/index.html,被第二個 location 處理。

    ·error_page
    當返回301或者302 code 的時候,相關的return directive 也可以執行,不同的是瀏覽器會顯示一個新的請求。rewrite 的 redirect 和 permanent 標誌也是相同的,然而這樣的 location search 是不期望的,因爲顯示的跳轉會導致一個新的請求。

    error_page directive 可以產生一個內部的跳轉,類似於 try_files。如果try_files 被設置了, error_page 可能永遠得不到執行。

root /var/www/main;

location / {
    error_page 404 /another/whoops.html;
}

location /another {
    root /var/www;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章