Nginx的Location匹配html
Location根據類型分爲兩種:普通配置和正則匹配nginx
1、 普通配置web
普通location根據使用方法又分爲兩種,格式以下:url
1. location / {spa
命令序列server
}htm
解釋:括號中定義的表示對當前路徑及子路徑下的全部對象有效。「優先級最低」對象
用戶全部的請求都能被它匹配到。blog
例子:域名
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 507;
}
匹配順序註解:
2、 正則匹配
正則匹配也分爲兩種:
~匹配的文件是區分字符 大小寫的
2.location ~* URI {} :
~*匹配的文件是不區分字符大小的
正則匹配是按照正則location編寫的順序生效的,一旦匹配成功即中止匹配到後續的location。
例子:
location ~ /bbs {
return 400;
}
location ~* /bbs {
return 500;
}
網頁返回錯誤信息400
而後將兩段配置調換一下位置
location ~* /bbs {
return 500;
}
location ~ /bbs {
return 400;
}
3、匹配順序和生效順序
匹配順序和生效順序是兩個概念
當配置中出現多個locaton而且普通和正則都有,那麼
一、匹配順序是:
用戶請求的URL
(1)先匹配普通location
普通location在匹配是按照編輯順序匹配
(2)在匹配正則location
正則location在匹配時按照編輯順序匹配
可是正則和普通locaiton不按照編輯順序匹配
2、生效順序
當普通和正則都存在的狀況下,遵循如下原則
1.nginx開始按照編輯順序依次匹配普通location
(1)若是匹配過程當中匹配到了
"location =" :nginx會當即生效即中止後續的匹配
(2)若是沒有"locaiton ="話,
若是匹配到"locatin ^~"。會中止後續的正則匹配.而後此策略當即生效。
(3) 若是以上兩種location都不存在的話
nginx會匹配全部location後看後續有沒有正則locaion
若是後續沒有正則locaiton
而後最大前綴locaiton生效
最後是location / 生效
若是後續還有正則location
一旦匹配成功一條正則locaion,這條會生效,而且會中止後續的正則匹配,還會會覆蓋前邊的普通location結果