一、普通匹配
普通location根据使用方法又分为两种,格式如下
1.匹配/
location / {
命令序列;
}
解释:括号中定义的表示对当前路径及子路径下的所有对象有效。“优先级最低”
用户所有的请求都能被它匹配到。
location / {
root /bybo;
}
这说明网页根目录在/bybo
用户所有的请求都能被这个location匹配到
[root@node1 ~]# mkdir /bybo
[root@node1 bybo]# cat index.html
<h1>bybo.com</h1>
[root@node1 bybo]# cd /usr/local/nginx/conf/vhost/
[root@node1 vhost]# cat bybocom.conf
server {
server_name www.bybo.com;
root /bybo;
location / {
index index.html index.htm;
}
}
[root@node1 vhost]# nginx -s reload
2.匹配/子路径
例子:
location /bbs {
root /bybo;
}
这就说明网页根目录是位于 /web/bbs
当用户访问:
http:
或者
http:
的时候可以被这个location匹配到
[root@node1 ~]# mkdir /bybo/bbs
[root@node1 ~]# cd /bybo/bbs/
#在/bbs下设置一个默认首页
[root@node1 bbs]# cat index.html
<h1>bybo/bbs</h1>
#在/bbs下在设置一个存放图片的目录images,然后上传一张图片1.jpg
[root@node1 ~]# mkdir /bybo/bbs/images
#配置nginx
[root@node1 vhost]# cat bybocom.conf
server {
server_name www.bybo.com;
root /bybo;
location / {
index index.html index.htm;
deny all; #拒绝所有人访问根
}
location /bbs { #但是没有限制bbs目录
index index.html index.htm;
}
}
[root@node1 vhost]# nginx -s reload
结果:
访问:
www.bybo.com 403被拒绝
访问:
http:
http:
例子2:
server {
server_name www.bybo.com;
root /bybo;
location / {
index index.html index.htm;
deny all;
}
location /bbs/images {
index index.html index.htm;
}
}
[root@node1 vhost]# nginx -s reload
结果:
访问:
http:
http:
访问:
http:
3.总结
当用户请求的url同时匹配到两段location时,
最大前缀生效(location /bbs生效)
如果没有这段(location /bbs) 第一段生效。
第一段相当于默认策略,因为location / 包含所有的请求,所有的请求都是以 ”/” 开始的
4."=" 匹配
location = /路径 {
命令序列
}
解释:括号中定义的表示对当前路径有效,子路径不生效(精确匹配指定的路径不包括子路径)。“它的优先级最高。”
一旦匹配到此location ,立即生效。其它location无论是否匹配到请求都不生效。
例子:
location = / {
rewrite
}
#只匹配根目录,子路径不匹配
例子1:
server {
server_name www.bybo.com;
root /bybo;
location / {
index index.html index.htm;
}
location = / {
deny all;
}
}
访问:
www.bybo.com 结果:403被拒绝,说明 location = 优先级高
www.bybo.com/index.html 结果: 正常访问。说明只对当前路径生效
http:
http:
例子2:
server {
server_name www.bybo.com;
root /bybo;
location /bbs {
index index.html index.htm;
}
location = /bbs/ {
deny all;
}
}
#如果这里这么写location = /bbs 是不生效的
#如果这里这么写location = /bbs/ 加上了/就生效了,说明它也是限制/bbs/index.html
#访问:
http:
http:
http:
总结:
loction = 限制只限于在浏览器中访问http://www.bybo.com/bbs 路径的时候有作用,只要加了子路径就不生效。
二、正则匹配
1. "~"匹配
~匹配的文件是区分字符 大小写的
location ~ /bbs {
}
2. “~*” 匹配
~*匹配的文件是不区分字符大小的
location ~* URI {
}
正则匹配是按照正则location编写的顺序生效的,一旦匹配成功即停止匹配后续的location。
location ~ /bbs {
return 400;
}
location ~* /bbs {
return 500;
}
#网页返回错误信息400
然后将两段配置调换一下位置
location ~* /bbs {
return 500;
}
location ~ /bbs {
return 400;
}
#网页返回错误信息500
三、匹配顺序和生效顺序
匹配顺序和生效顺序是两个概念 当配置中出现多个locaton并且普通和正则都有,那么
1.匹配顺序
(1)先匹配普通location
? 普通location在匹配是按照编辑顺序匹配
(2)在匹配正则location
? 正则location在匹配时按照编辑顺序匹配
但是正则和普通locaiton不按照编辑顺序匹配
2.生效顺序
当普通和正则都存在的情况下,遵循以下原则
(1)如果匹配过程中匹配到了"location =" :nginx会立即生效即停止后续的匹配 (2)如果没有"locaiton =“话 如果匹配到"locatin ^~”。会停止后续的正则匹配 然后最大前缀locaiton生效 最后是location / 生效 (3)如果以上两种location都不存在的话 nginx会匹配所有location后看后续有没有正则locaion 如果后续没有正则locaiton 然后最大前缀locaiton生效 最后是location / 生效
? 如果后续还有正则location ? 一旦匹配成功一条正则locaion,这条会生效,并且会停止后续的正则匹配,还会会覆盖前边的 普通location结果
?
|