URL地址匹配是Nginx配置中最靈活的部分 Location 支持正則表達式匹配,也支持條件匹配,用戶可以通過location指令實現Nginx對動丶靜態網頁的過濾處理。
Nginx location 配置語法
location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
location 配置可以有兩種配置方法
前綴 + uri(字符串/正則表達式)
@ + name
前綴含義
=:精確匹配(必須全部相等)
~:大小寫敏感
~*:忽略大小寫
^~:只需匹配uri部分
@:內部服務跳轉
Location 基礎知識
location 是在 server 塊中配置。
可以根據不同的 URI 使用不同的配置(location 中配置),來處理不同的請求。
location 是有順序的,會被第一個匹配的location 處理。
Location 配置演示
=精確匹配
location = / { #規則 }
#則匹配到 `http://www.example.com/` 這種請求。
~大小寫敏感
location~ /Example/ { #規則 }
#請求示例#http://www.example.com/Example/ [成功]
#http://www.example.com/example/ [失敗]
~*大小寫忽略
location~* /Example/ { #規則 }
# 則會忽略 uri 部分的大小寫
#http://www.example.com/Example/ [成功]
#http://www.example.com/example/ [成功]
^~只匹配以 uri 開頭
location ^~ /img/ { #規則 }
#以 /img/ 開頭的請求,都會匹配上
#http://www.example.com/img/a.jpg [成功]
#http://www.example.com/img/b.mp4 [成功]
@nginx內部跳轉
location /img/ { error_page404@img_err; }
location@img_err { # 規則 }
#以 /img/ 開頭的請求,如果鏈接的狀態為 404。則會匹配到 @img_err 這條規則上。
規則分類
其中“~ ”和“~”以及“!~”和“!~”前綴表示正則location .
其他前綴(包括:“=”,“^~”和“@ ”)和無任何前綴的都屬於普通location .
匹配規則
普通 location ”的匹配規則是“最大前綴.(特殊的是“=”和“^~”,前綴指令將嚴格匹配uri ,如果匹配,停止搜索.)正則 location ”的匹配規則是“順序匹配,且只要匹配到第一個就停止后面的匹配.通用匹配 “/”最后匹配
先匹配普通 location ,再“考慮”匹配正則 location 。注意這里的“考慮”是“可能”的意思,也就是說匹配完“普通 location ”后,有的時候需要繼續匹配“正則 location ”,有的時候則不需要繼續匹配“正則 location ”。
兩種情況下,不需要繼續匹配正則 location :
( 1 )當普通 location 前面指定了“ ^~ ”,特別告訴 Nginx 本條普通 location 一旦匹配上,則不需要繼續正則匹配;
( 2 )當普通location 恰好嚴格匹配上,不是最大前綴匹配,則不再繼續匹配正則.
總結:正則 location 匹配讓步普通 location 的嚴格精確匹配結果;但覆蓋普通 location 的最大前綴匹配結果.