nginx location 正則匹配
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;
}
二、 正則匹配
正則匹配也分為兩種:
1. 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結果
以上就是小編今天的分享了,希望可以幫助到大家。