[转载+整理]Nginx Location匹配规则
规则语法
语法 | 匹配规则 |
---|---|
空 | 普通匹配(遵循最大前缀匹配规则, 优先度比正则低) |
= | 精确(严格)匹配, 优先度最高 后续不再匹配正则 |
^~ | 非正则匹配(依然遵循最大前缀匹配规则) 后续不再匹配正则 |
~ | 表示区分大小写的正则匹配 |
~* | 表示不区分大小写的正则匹配 |
/ | 通用匹配,任何请求都会匹配到(本质上等同于语法 空 ) |
!~
和 !~*
分别为区分大小写不匹配及不区分大小写不匹配 的正则, 但是是用于条件判断的时候(即 if
语句)
if ($host !~* "^www\.") {
# ...
}
匹配简单来说:
优先匹配
=
精确匹配, 若未匹配到则转下一步骤依照最大前缀匹配规则, 先匹配普通规则(
空
,^~
)若最终匹配到
^~
, 则使用若匹配到
空
或 未匹配到, 则转下一步骤(当前匹配结果暂时保存)按照物理存储顺序, 若匹配到任意一条正则, 马上使用(无视后面正则)
若未匹配到任意正则, 则使用步骤2中匹配到普通正则
location 分类
只有两类:正则location和普通location
~
和 ~*
为正则location
=
、^~
、@
和无任何前缀的都属于普通location,另外,@
是用作服务端内部的一种转发行为,很少用,在此不做讨论。
匹配顺序:
- 先普通,再正则
- 普通location之间的匹配顺序:按最大前缀匹配
如location /a/{}
,location /a/b/ {}
,请求 http://a/b/c.html 匹配的是location /a/b/ {}
- 正则location之间的匹配顺序:按配置文件中的物理顺序匹配,只要匹配到一条正则,就不再考虑后面的
- 若普通location匹配到 精确匹配
=
或 非正则匹配^~
, 则不再进行后续的正则匹配 - 普通location与正则location之间的匹配结果选择
- 普通location先匹配,匹配到了结果,只是一个临时结果;
- 会继续正则location的匹配,
- 如果匹配到正则,则用匹配到的正则结果;
- 如果没有匹配到正则,则继续用普通匹配的那个结果
综上,常规的顺序是匹配完普通location,还要继续匹配正则location,但是,也可以告诉nginx,匹配到了普通location,就不要再搜索匹配正则location了,通过在普通location前面加上^~
符号,^
表示非,~
表示正则,^~
就是表示不要继续匹配正则。
除了^~
,=
也可阻止nginx继续匹配正则,区别在于^~
依然遵循最大前缀匹配规则,而=是严格匹配
扩展
location / {}
和 location =/ {}
的区别
/ {}
作为普通匹配,是遵循最大前缀匹配原则的,所以,对于一个url,如果有更特殊合适的匹配,就选特殊合适的,如果没有更特殊合适的匹配,也有 / {}
兜着,就像是默认配置一样
=/ {}
遵循的是严格匹配规则,只能匹配到 http://ip:port/,同时会停止搜索正则匹配。
测试
接下来测试验证。
1.先验证第二条:普通location之间的匹配顺序:按最大前缀匹配
nginx.conf配置:
#普通location
location /a/b {
return 666;
}
#普通location
location /a/b/c {
return 777;
}
测试链接:http://192.168.88.38/a/b,http状态码为666,符合预期。如图(后面的测试可自行F12打开浏览器控制台查看http状态码,不再截图):
测试链接:http://192.168.88.38/a/b/c,http状态码为777,匹配的是location /a/b/c {return 777;},符合预期。
2.验证第三条:正则location之间的匹配顺序:按配置文件中的物理顺序匹配,只要匹配到一条正则,就不再考虑后面的
nginx.conf配置:
location ~* /a {
return 999;
}
#匹配a-z的任意一个字母
location ~* ^/[a-z]$ {
return 666;
}
测试链接:http://192.168.88.38/a,http状态码999,匹配的是location ~* /a {renturn 999;},符合预期。
将nginx.conf中的两个正则匹配顺序调换下:
location ~* ^/[a-z]$ {
return 666;
}
location ~* /a {
return 999;
}
测试链接:http://192.168.88.38/a,http状态码666,匹配的是location ~* ^/[a-z]$,符合预期。
3.验证第4条,其实第4条就相当于是总结性的匹配顺序了:
nginx.conf配置:
#普通location
location /a {
return 666;
}
#普通location
location /a/b {
return 777;
}
#正则location
location ~* /a/b {
return 888;
}
测试链接:http://192.168.88.38/a,http状态码666,匹配到普通location,location /a {return 666;},符合预期。
测试链接:http://192.168.88.38/a/b,http状态码777,先进行普通location匹配,遵循最大前缀原则,匹配到location /a/b {return 777; },但是,这只是一个临时结果,因为接下来还要继续往下进行正则location匹配,匹配到 location ~* /a/b { return 888; },最终返回结果为888。符合预期。
将正则location的规则改下:
#普通location
location /a {
return 666;
}
#普通location
location /a/b {
return 777;
}
#正则location
location ~* /a/c {
return 888;
}
测试链接:http://192.168.88.38/a/b,http状态码777,匹配到location /a/b {return 777; },并且因为接下来没有符合的正则location,所以最终返回为777,符合预期。
综上,location的匹配顺序及结果取值都符合2,3,4点结论。
接下来再测试验证普通location中的~及=符号对于匹配搜索过程的阻断效果,当然,别忘了这俩符号的真实作用。~为普通字符匹配,=为精确匹配。
^~测试验证nginx.conf配置:
location /a {
return 666;
}
#普通匹配
location ^~ /a/b {
return 777;
}
#正则location
location ~* /a/b {
return 888;
}
测试链接:http://192.168.88.38/a/b,匹配到 location ^~ /a/b {return 777;}后,因为使用了^~符号,不再继续搜索正则location匹配,所以,虽然下面有符合条件的正则location,但是最终还是返回了777,符合预期。
=测试验证nginx.conf配置:
location /a {
return 666;
}
#普通匹配
location = /a/b {
return 777;
}
#正则location
location ~* /a/b {
return 888;
}
测试链接:http://192.168.88.38/a/b,匹配到 location = /a/b {return 777;}后,因为使用了=符号,不再继续搜索正则location匹配,最终返回777,符合预期。
另附上常用正则表达式:
- . : 匹配除换行符外的任意字符
- ? : 重复0次或1次
- : 重复1次或更多次
- : 重复0次或更多次
- \d :匹配数字
- ^ : 匹配字符串的开始
- $ : 匹配字符串的结束
- {n} : 重复n次
- {n,} : 重复n次或更多次
- [c] : 匹配单个字符,如此处的字符 c
- [a-z] : 匹配a-z小写字母的任意一个
- (a|b|c):匹配a或b或c
作者:Etyero
来源:CSDN
原文:https://blog.csdn.net/u010798968/article/details/76215445
版权声明:本文为博主原创文章,转载请附上博文链接!
[转载+整理]Nginx Location匹配规则的更多相关文章
- [整理] Nginx Location 匹配规则
目录 规则语法 location 分类 匹配顺序: 扩展 location / {}和 location =/ {}的区别 如何快速测试 规则语法 语法 匹配规则 空 普通匹配(遵循最大前缀匹配规则, ...
- nginx location匹配规则
谢谢作者的分享精神,原文地址:http://www.nginx.cn/115.html location匹配命令 ~ #波浪线表示执行一个正则匹配,区分大小写~* #表示执行一个正则匹 ...
- 转:nginx location匹配规则
location匹配命令 ~ #波浪线表示执行一个正则匹配,区分大小写~* #表示执行一个正则匹配,不区分大小写^~ #^~表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配 ...
- 【转】nginx location匹配规则
转载请保留:http://www.nginx.cn/115.html location匹配命令 ~ #波浪线表示执行一个正则匹配,区分大小写~* #表示执行一个正则匹配,不区分大小写^ ...
- Nginx location 匹配规则详解
语法规则 location [=|~|~*|^~] /uri/ { … } 模式 含义 location = /uri = 表示精确匹配,只有完全匹配上才能生效 location ^~ /uri ^~ ...
- Nginx location 匹配规则
1. default_server: 当请求没有匹配到服务器中配置的任何一个server的时候,会默认把请求route到配置了default_server的virtual host中.参考地址:htt ...
- Nginx之location 匹配规则详解
有些童鞋的误区 1. location 的匹配顺序是“先匹配正则,再匹配普通”. 矫正: location 的匹配顺序其实是“先匹配普通,再匹配正则”.我这么说,大家一定会反驳我,因为按“先匹配普通, ...
- 前端开发掌握nginx常用功能之server&location匹配规则
nginx主要是公司运维同学必须掌握的知识,涉及到反向代理.负载均衡等服务器配置.前端开发尤其是纯前端开发来说对nginx接触的并不多,但是在一些情况下,nginx还是需要前端自己来搞:例如我们公司的 ...
- nginx多虚拟主机优先级location匹配规则及tryfiles的使用
nginx多虚拟主机优先级location匹配规则及tryfiles的使用 .相同server_name多个虚拟主机优先级访问 .location匹配优先级 .try_files使用 .nginx的a ...
随机推荐
- PCL 3维点云的模板匹配
Doc 来自PCL官方文档 http://www.pointclouds.org/documentation/tutorials/template_alignment.php#template-ali ...
- dwz监听日期变化,dwz日期控件onchange不起作用,dwz框架时间控件不支持onchange事件
转载自:http://blog.csdn.net/sp308036654/article/details/50638348 <input type="text" class= ...
- Java 设计模式系列(八)装饰者模式
Java 设计模式系列(八)装饰者模式 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案.Decorator 或 Wrapper 一.装饰模 ...
- Hibernate 基本概念
这一段正在学Hibernate,首先要了解下Hibernate大概的意思,究竟什么是Hibernate,到底它是个什么东西,必须从整体上把握下Hibernate在整个开发过程中所起到的作用,这样对更深 ...
- serialVersionUID的作用以及IDEA、Eclipse如何自动生成serialVersionUID
说到serialVersionUID,首先要讲讲序列化. 序列化: 序列化可以将一个java对象以二进制流的方式在网络中传输并且可以被持久化到数据库.文件系统中,反序列化则是可以把之前持久化在数据库或 ...
- Docker 基本原理
1 什么是Docker? Docker是基于Go语言实现的云开源项目.Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装.分 ...
- Oracle学习笔记(三)
五.操作表 1.表分为行和列 约定:每行数据唯一性,每列数据同类性,每列列名唯一性. 2.数据类型 字符型 -- 固定长度的字符类型 字符类型:CHAR(n)(MAX n=2000).NCHAR(MA ...
- 试题 E: 迷宫 第十届蓝桥杯
[问题描述]下图给出了一个迷宫的平面图,其中标记为 1 的为障碍,标记为 0 的为可以通行的地方.010000000100001001110000迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个 ...
- Anti-Anti dylib(反 反-dylib钩子(Anti-tweak))
版主提供了 anti dylib 的文章,http://bbs.chinapyg.com/thread-76158-1-1.html原理很简单,看下面源代码即可~ 在Build Settings中找 ...
- SqlerMonitor-复制
在复制系统中因为一些配置上失误和人为的失误操作导致复制堵塞,Sqler Monitor 新增加了分析复制延迟邮件,配合复制错误监控邮件和延迟邮件,和复制元数据采集 可以在第一时间准确定位到问题,适合大 ...