#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;
}
|