nginx服务location区段匹配规则详解
1. location区段
通过指定模式来与客户端请求的URI相匹配
//功能:允许根据用户请求的URI来匹配定义的各location,匹配到时,此请求将被相应的location配置块中的配置所处理,例如做访问控制等功能
//语法:location [ 修饰符 ] pattern {......}
详细语法可以查看nginx官方文档
在配置文件里新加一个location,添加web信息
.............
location / {
root html;
index index.php index.html index.htm;
}
location /zabbix {
root /opt/myweb; //定义存放目录
index index.html;
}
.............
如果是直接在 /opt/myweb下创建的话,访问会报错,如下图所示
这时需要注意了, 此时的顺序应该/opt/myweb/zabbix/index.html
所以此时应该先创建zabbix再创建index.html,之后nginx重读文件,再次访问
刚才那种方式会显得有些繁琐,此时可以把root更改为alias
...........
location /zabbix {
alias /opt/myweb;
index index.html;
}
...........
此时访问的顺序是 /opt/myweb/index.html
因为要演示修饰符的效果,所以这里nginx需要重新安装一个echo模块
2. 安装nginx-echo模块
//下载模块
[root@longnian ~]# wget https://github.com/openresty/echo-nginx-module/archive/v0.61.tar.gz
//解压
[root@longnian ~]# tar xf v0.61.tar.gz
//查看原来的编译参数
[root@longnian ~]# nginx -V
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-debug --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log
//重新编译nginx
[root@longnian nginx-1.18.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-debug --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --add-module=/root/echo-nginx-module-0.61
//在最后加上--add-module=/root/echo-nginx-module-0.61
[root@longnian nginx-1.18.0]# make
//将nginx安装目录中的nginx文件备份
[root@longnian ~]# mv /usr/local/nginx/sbin/nginx /opt
//将我们重新编译的nginx文件复制到nginx安装目录中
[root@longnian ~]#nginx -s stop;cp nginx /usr/local/nginx/sbin/;nginx
//上面这种方式,在文件启动的时候也能复制进去
//重载配置文件
[root@longnian ~]# nginx -s reload
3. 讲解匹配规则
常用修饰符说明:
修饰符 | 功能 |
---|---|
= | 精确匹配 |
~ | 正则表达式模式匹配,区分大小写 |
~* | 正则表达式模式匹配,不区分大小写 |
^~ | 前缀匹配,类似于无修饰符的行为,也是以指定模块<>开始,不同的是,如果模式匹配,那么就停止搜索其他模式了,不支持正则表达式 |
@ | 定义命名location区段,这些区段客户端不能访问,只可以由内部产生的请求来访问,如try_files或error_page等 |
没有修饰符的情况下
//在配置文件里添加新的location
............
location /abc {
echo "没有修饰符";
}
............
//用curl来访问验证
[root@longnian ~]# curl http://192.168.159.144/abc
没有修饰符
[root@longnian ~]# curl http://192.168.159.144/abc/
没有修饰符
[root@longnian ~]# curl http://192.168.159.144/abc/haha
没有修饰符
[root@longnian ~]# curl http://192.168.159.144/abcd
没有修饰符
[root@longnian ~]# curl http://192.168.159.144/ab
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>
通过验证可以发现,只要开头是abc的,后面无论接的什么内容,都能匹配到。最后把abc修改为ab,结果就报错了!
总结就是:
所有请求都可以匹配到,匹配到一个普通格式后,搜索并未结束,而是暂存当前匹配的结果,并继续搜索正则匹配模式 ,匹配到正则就交给正则匹配处理,如果没有匹配到正则就以暂存的结果为匹配结果
修饰符“=”:精准匹配
//在配置文件里添加新的location
............
location = /abc {
echo "我只能被精准匹配到!";
}
............
//用curl来访问验证
[root@longnian ~]# curl http://192.168.159.144/abc
我只能被精准匹配到!
[root@longnian ~]# curl http://192.168.159.144/abc/
没有修饰符
[root@longnian ~]# curl http://192.168.159.144/abc/xixi
没有修饰符
[root@longnian ~]# curl http://192.168.159.144/ab
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>
通过验证可以看出,/abc用了精准匹配之后,只有在匹配abc的时候才能访问出来,其他任何情况都不能访问到abc
总结就是:
严格匹配,只有完全相等才匹配成功,然后停止匹配,不然继续匹配
修饰符“~”:正则表达式模式匹配,区分大小写
//在配置文件里添加新的location
............
location ~ ^/abc$ {
echo "我是区分大小写的!";
}
............
//用curl来访问验证
[root@longnian ~]# curl http://192.168.159.144/abc
我是区分大小写的!
[root@longnian ~]# curl http://192.168.159.144/ABC
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>
[root@longnian ~]# curl http://192.168.159.144/abc/
没有修饰符
通过验证可以看出,效果很明显,加上了~,大写的就不能访问到!
修饰符“~*”:正则表达式模式匹配,不区分大小写
//在配置文件里添加新的location
............
location ~* ^/abc$ {
echo "我是不区分大小写的!";
}
............
//用curl来访问验证
[root@longnian ~]# curl http://192.168.159.144/abc
我是区分大小写的!
[root@longnian ~]# curl http://192.168.159.144/ABC
我是不区分大小写的!
[root@longnian ~]# curl http://192.168.159.144/abc/
没有修饰符
通过验证可以看出,效果很明显,加上了~*,就不区分了大小写
补充:
~ 和 ~* 实质上是同级的,优先级取决于配置文件书写的先后顺序,先写的优先级高
查找顺序和优先级:由高到底依次为
- 带有=的精确匹配优先
- 正则表达式按照他们在配置文件中定义的顺序
- 带有^~修饰符的,开头匹配
- 带有或*修饰符的,如果正则表达式与URI匹配
- 没有修饰符的精确匹配
要点总结:
- location 的匹配顺序是“先匹配普通,再匹配正则”
- 普通匹配与配置书写顺序无关,因为按照匹配的长短来取匹配结果
- 正则匹配与顺序有关,因为是从上往下匹配。
- 正则匹配项匹配规则,受配置文件的前后顺序影响,但普通匹配模式不会
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ⁾⁾!