nginx 匹配順序
Nginx的Location匹配
Location根據類型分為兩種:普通配置和正則匹配
一、 普通配置
普通location根據使用方法又分為兩種,格式如下:
- 1. location / {
命令序列
}
解釋:括號中定義的表示對當前路徑及子路徑下的所有對象有效。“優先級最低”
用戶所有的請求都能被它匹配到。
例子:
location / {
root /web;
相應策略
}
這說明網頁根目錄在/web
訪問的時候直接http://127.0.0.1或是域名就可以了
用戶所有的請求都能被它匹配到
location /bbs {
root "/web";
相應策略
}
這就說明網頁根目錄是位於 /web/bbs
訪問的時候直接http://127.0.0.1/bbs就可以了
當用戶訪問
http://127.0.0.1/bbs/
或是
http://127.0.0.1/bbs/子路徑
的時候才能被上邊的路徑匹配到。
問題:當用戶訪問http://127.0.0.1/bbs/a.html時
這兩段location 同時存在時如下,那麽哪段配置會生效呢?
server {
listen 80;
server_name www.benet.com;
index index.html;
location / {
root /web;
}
location /bbs {
root /web;
}
結論就是,
當用戶請求的(/bbs)url同時匹配到兩段location時,
最大前綴生效(location /bbs生效)
如果沒有這段(location /bbs)第一段生效。
第一段相當於默認策略,因為location / 包含所有的請求,所有的請求都是以
- 2. location = /路徑 {
命令序列
}
解釋:括號中定義的表示對當前路徑有效,子路徑不生效(精確匹配指定的路徑不包括子路徑)。“它的優先級最高。”
例子:
location = /prefix {
}
也就是用戶訪問www.benet.com/prefix能被上邊的location匹配到,它只匹配"/prefix",
"/"下的子路不匹配。
用戶訪問www.benet.com/prefix/a 就不能被它匹配到
優先級最高:指的是一旦匹配到此location ,立即生效。其它location無論是否匹配到請求都不生效。
例子:
location /prefix/ {
root /;
}
location = /prefix/ {
return 500;
}
匹配順序註解:
二、 正則匹配
正則匹配也分為兩種:
- location ~ URI {}
~匹配的文件是區分字符 大小寫的
2.location ~* URI {} :
~*匹配的文件是不區分字符大小的
正則匹配是按照正則location編寫的順序生效的,一旦匹配成功即停止匹配到後續的location。
例子:
location ~ /bbs {
return 400;
}
location ~* /bbs {
return 500;
}
網頁返回錯誤信息400
然後將兩段配置調換一下位置
location ~* /bbs {
return 500;
}
location ~ /bbs {
return 400;
}
三、匹配順序和生效順序
匹配順序和生效順序是兩個概念
當配置中出現多個locaton並且普通和正則都有,那麽
1、匹配順序是:
用戶請求的URL
(1)先匹配普通location
普通location在匹配是按照編輯順序匹配
(2)在匹配正則location
正則location在匹配時按照編輯順序匹配
但是正則和普通locaiton不按照編輯順序匹配
2、生效順序
當普通和正則都存在的情況下,遵循以下原則
1.nginx開始按照編輯順序依次匹配普通location
(1)如果匹配過程中匹配到了
"location =" :nginx會立即生效即停止後續的匹配
(2)如果沒有"locaiton ="話,
如果匹配到"locatin ^~"。會停止後續的正則匹配
然後最大前綴locaiton生效
最後是location / 生效
(3) 如果以上兩種location都不存在的話
nginx會匹配所有location後看後續有沒有正則locaion
如果後續沒有正則locaiton
然後最大前綴locaiton生效
最後是location / 生效
如果後續還有正則location
一旦匹配成功一條正則locaion,這條會生效,並且會停止後續的正則匹配,還會會覆蓋前邊的普通location結果
nginx 匹配順序