(1) ~*, 表示不區分大小寫的匹配。
(2) ~, 表示區分大小寫的匹配。
對于非正則的匹配,即字符串匹配,有如下前綴:
(1) ^~, 表示匹配到字符串后,終止正則匹配。
(2) =, 表示精確匹配。
(3) @, 當然,這個也算不上字符串匹配。如果可以,你也可以將其理解成是正則匹配。它是一個命名標記,這種 location 不會用于正常的請求,它們通常只用于處理內部的重定向。
在匹配過程中,Nginx 將首先匹配字符串,然后匹配正則表達式。匹配到第一個正則表達式后,會停止搜索。如果匹配到正則表達式,則使用正則表達式的搜索結果,如果沒有匹配到正則表達式,則使用字符串的搜索結果。
上面這段話的意思是說,有一個字符串和正則表達式均能匹配上,那么會使用正則表達式的搜索結果。這里,我們可以使用前綴"^~" 來禁止匹配到字符串后,繼續檢查正則表達式。匹配到 URI 后,將停止搜索。
使用前綴 "=" 可以進行精確的 URI 匹配,如果找到匹配的 URI,則停止搜索。"location = /" 只能匹配到 "/",而 "/test.html" 則不能被匹配。
正則表達式的匹配,按照它們在配置文件中的順序進行,寫在前面的優先。
另外,前綴 "@" 是一個命名標記,這種 location 不會用于正常的請求,它們通常只用于處理內部的重定向(例如:error_page, try_files)。
最后總結一下匹配的過程:
(1) 前綴 "=" 先進行匹配,如果找到了,終止搜索。
(2) 對所有其它 location 進行非正則的匹配,找到最精確匹配(對于 /blog/admin/ 這個 URI, location /blog 要比 location / 長,因此 location /blog 要比 location / 要精確)的那個。如果找到的這個是帶"^~" 前綴的,則終止搜索并直接返回找到的這個,否則開始正則查找。會不會出現所有的非正則匹配都無法匹配到 URI 呢,當然,你若不定義一個 location /,這種情況的確會發生,沒關系啊,它會進行正則查找的。
(3) 正則查找,按照我們配置文件中配置的 location 順序進行查找。
(4) 如果正則查找匹配成功,則使用此正則匹配的 location,否則,使用第二步查找的結果。如果『否則』發生了,同時,第二步中的粗體字部分的假設的情況也發生了,怎么辦?404 會等著你的。
例子:
location = / {
# 只匹配 / 查詢。
[ configuration A ]
}
location / {
# 匹配任何查詢,因為所有請求都已 / 開頭。但是正則表達式規則和長的塊規則將被優先和查詢匹配。
[ configuration B ]
}
location ^~ /images/ {
# 匹配任何已 /images/ 開頭的任何查詢并且停止搜索。任何正則表達式將不會被測試。
[ configuration C ]
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配任何已 gif、jpg 或 jpeg 結尾的請求。然而所有 /images/ 目錄的請求將使用 Configuration C。
[ configuration D ]
}
例子請求:
1, / -> 精確匹配到第1個location,匹配停止,使用configuration A
2,/some/other/url -> 首先前綴部分字符串匹配到了第2個location,然后進行正則匹配,顯然沒有匹配上,則使用第2個location的配置configurationB
3,/images /1.jpg -> 首先前綴部分字符串匹配到了第2個location,但是接著對第3個location也前綴匹配上了,而且這時已經是配置文件里面對這個url的最大字 符串匹配了,并且location帶有 "^~" 前綴,則不再進行正則匹配,最終使用configuration C
4,/some/other/path/to/1.jpg -> 首先前綴部分同樣字符串匹配到了第2個location,然后進行正則匹配,這時正則匹配成功,則使用congifuration D
注意:按任意順序定義這4個配置結果將仍然一樣。