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結果

以上就是小編今天的分享了,希望可以幫助到大家。