一、普通匹配

普通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://127.0.0.1/bbs
	或者
	http://127.0.0.1/bbs/子路径
的时候可以被这个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://www.bybo.com/bbs/				#成功访问
http://www.bybo.com/bbs/images/1.jpg	#成功访问

例子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://www.bybo.com/  		#403 权限被拒绝
	http://www.bybo.com/bbs/	#403 权限被拒绝

访问:
	http://www.bybo.com/bbs/images/1.jpg  #成功访问
	

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://www.bybo.com/a.html	结果: 正常访问。说明只对当前路径生效
	http://www.bybo.com/bbs/images/1.jpg 	结果: 正常访问。说明只对当前路径生效

例子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://www.bybo.com/bbs/			#403被拒绝
 	http://www.bybo.com/bbs/index.html	#成功访问
 	http://www.bybo.com/bbs/a.html		#成功访问
总结:
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结果

​

更多推荐