[转载+整理]Nginx Location匹配规则
目录
- 规则语法
- location 分类
- 匹配顺序:
- 扩展
location / {}
和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配置:
#普通locationlocation /a/b {return 666;}#普通locationlocation /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的规则改下:
#普通locationlocation /a {return 666;}#普通locationlocation /a/b {return 777;}#正则locationlocation ~* /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;}#正则locationlocation ~* /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;}#正则locationlocation ~* /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
版权声明:本文为博主原创文章,转载请附上博文链接!
转载于:https://www.cnblogs.com/youjiaxing/p/10439240.html
[转载+整理]Nginx Location匹配规则相关推荐
- nginx之location匹配规则
Nginx之location 匹配规则详解 有些童鞋的误区 1. location 的匹配顺序是"先匹配正则,再匹配普通". 矫正: location 的匹配顺序其实是" ...
- location 匹配规则 (NGINX)
转:https://moonbingbing.gitbooks.io/openresty-best-practices/ngx/nginx_local_pcre.html location 匹配规则 ...
- Nginx之location 匹配规则详解
Nginx 的语法形式是: location [=|~|~*|^~|@] /uri/ { - } ,意思是可以以" = "或" ~* "或" ~ &q ...
- nginx中location匹配规则与proxy_pass代理转发
最近使用nginx在服务器上配置,在做路径匹配时上遇到细节上的东西,在此做记录,安装请转 windows下安装使用nginx教程 一.location匹配规则 1.前缀匹配:不带符号 server { ...
- 【Nginx学习系列】location匹配规则
location 匹配规则 规则 匹配 = 严格匹配.如果请求匹配这个 location,那么将停止搜索并立即处理此请求 ~ 区分大小写匹配(可用正则表达式) ~* 不区分大小写匹配(可用正则表达式) ...
- nginx转发html文件,Nginx 转发匹配规则的实现
一.正则表达式匹配 ~ 为区分大小写匹配 ~* 为不区分大小写匹配 !~ 和 !~* 分别为区分大小写不匹配及不区分大小写不匹配 二.文件及目录匹配 -f 和 !-f 用来判断是否存在文件 -d 和 ...
- ngix 常用配置之 location 匹配规则
大家好,我是 17. 今天和大家详细聊聊 nginx 的 location 匹配规则 location 匹配规则 @ 匹配规则在后面的 try_files 中有举例 location 按如下优先级匹配 ...
- Nginx—核心配置location匹配规则说明
2019独角兽企业重金招聘Python工程师标准>>> location介绍 location指令是Nginx中最核心的一项配置,根据预先定义的URL匹配规则来接收用户发送的请求,根 ...
- nginx location 匹配 多个规则_你需要知道的Nginx配置二三事
Nginx是俄罗斯人Igor Sysoev基于C语言编写的十分轻量级的HTTP服务器,它主要有以下特点: 它是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器 ...
最新文章
- python解多项式方程_python – SymPy不能求解四阶多项式方程
- C++--深入分析MFC文档视图结构(项目实践)
- rails 5 action cable 服务器部署
- 儿童手表怎么删除联系人_华为儿童手表4X体验:与你一起守护孩子的成长,带娃不再辛苦...
- 使用HTML5开发手机离线应用
- PyTorch 深度学习模型压缩开源库(含量化、剪枝、轻量化结构、BN融合)
- jwt 私钥_三分钟带你了解JWT认证
- spring cloud 资源
- Gmail最新功能实测:离线版上线增加手势(多图)
- jQuery 学习-DOM篇(一):jQuery 创建元素并添加属性
- VC与VS的对应关系
- 大学英语综合教程四 Unit 6 课文内容英译中 中英翻译
- 安卓分屏神器_【实用工具】一款鲜为人知的电脑神器,内置300多…找了很久了!...
- laravel excel 导出图片
- 毕业生自传---(蝶变亚信)
- 【ACWing】4246. 最短路径和
- Java基础学习之函数式编程Comsumer接口(JDK8)
- 灵魂讲师分享的:po是什么?自动化测试po分层如何实现?-带po详细源代码
- 计算机专业研究生阶段有几大研究方向可以选择
- 重庆顶香味分析快手春竹笋的制作方法
热门文章
- 21朵水仙花算法java_水仙花数算法 - hi_jyf - OSCHINA - 中文开源技术交流社区
- android 内存检测开源库 翻译,开源 | 哈佛大学NLP组开源神经机器翻译工具包OpenNMT:已达到生产可用水平...
- 风变编程Python9 函数的学习
- textview 加粗_Android 改变 TextView 内局部样式
- 贝叶斯集锦:贝叶斯派和频率派的一个例子
- thinkpad键盘功能键驱动_韩度X-104机械键盘拆解评测 - 性价之选
- python做前端mongodb_python-mongodb基本操作都在这了
- 64位电脑 装32位oracle,64位Windows可以安装32位的Oracle吗
- PAT (Basic Level) Practice1021 个位数统计
- Java比较两个对象属性值变化情况,用于记录日志使用