1. 程式人生 > >nginx 匹配順序

nginx 匹配順序

gin web name index 表示 其它 turn nginx http

Nginx的Location匹配

Location根據類型分為兩種:普通配置和正則匹配

一、 普通配置

普通location根據使用方法又分為兩種,格式如下:

  1. 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 / 包含所有的請求,所有的請求都是以

”/” 開始的

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



nginx 匹配順序