在 Nginx 中我们可以通过配置 location 指令块,来决定一个请求 url 如何处理。如果我们编写了多条 location 指令块,如何保证各个 location 不会产生冲突?如何理清 location 的匹配顺序?

带着这两个问题,我们先来做几道练习题。

原文地址,欢迎 Star 和 订阅 我的博客。

Nginx Location 小练习

问题 1、如果访问 /abcd 会匹配到哪个 config?

server 

问题 2、如果访问 /abcd 会匹配到哪个 config?

server 

问题 3、如果访问 /abcd 会匹配到哪个 config?

server 

如果这 3 道小练习让你很费解,那么我们就接着深入研究,相信你一定会有所收获,如果只想知道答案,请直接看文章末尾。

Nginx location 配置语法

Nginx location 配置语法如下

location [ = | ~ | ~* | ^~ | 空 ] url { … }

其中 [ = | ~ | ~* | ^~ | 空 ] 表示 location 的修饰符,具体含义如下

  • = 表示精准匹配(完全相等时,才会命中规则)。
  • ~ 表示区分大小写的正则匹配。
  • ~* 表示不区分大小写的正则匹配。
  • ^~ 表示最佳匹配。
  • 空,匹配以 url 开头的字符串,只能是普通字符串。

Nginx location 的匹配过程

一般来说,一个 nginx.conf 文件通常会配置多个匹配规则,如果多个匹配规则都匹配到了 url,最终会执行哪一个呢?

1、Nginx 首先根据 url 检查最长匹配前缀字符串,即会判断【=】、【^~】、【空】修饰符定义的内容。

  • 如果匹配到最长匹配前缀字符串。
  • 如果最长匹配前缀字符串被【=】修饰符匹配,则立即响应
  • 如果没有被【=】修饰符匹配,则执行第 2 步判断。
  • 如果没有匹配到最长匹配前缀字符串,则执行第 3 步判断。

2、Nginx 继续检查最长匹配前缀字符串,即判断【^~】、【空】修饰符定义的内容。

  • 如果最长匹配前缀字符串被【^~】修饰符匹配,则立即响应
  • 如果被【空】修饰符匹配,则将该匹配保存起来,并执行第 3 步判断。

3、Nginx 找到 nginx.conf 中定义的所有正则匹配(~ 和 ~*),并按顺序进行匹配。

  • 如果有任何正则表达式匹配成功,则立即响应
  • 如果没有任何正则匹配成功,则响应第 2 步中存储的【空】匹配

小练习答案
问题 1:最长匹配字符串为 abc,且有 ^~ 匹配,故结果为:config3。
问题 2:最长匹配字符串为 abc,被【空】匹配,故会开始查询正则匹配,匹配到正则 ~ /abc,故结果为:config1。
问题 3:最长匹配字符串为 abc,被【空】匹配,故会开始查询正则匹配,没有匹配到任何正则,故使用【空】匹配到的结果:config2。

参考资料

Understanding Nginx Server and Location Block Selection Algorithms

nginx location 匹配 多个规则_三道小练习助你弄懂 Nginx location 匹配相关推荐

  1. 中修改环境变量_系统小技巧:彻底弄懂Windows 10环境变量

    每当我们进行系统清理时,清理软件总能自动找到Windows的临时文件夹之所在,然后加以清理,即便是我们重定向了TEMP目录也是如此.究其原因,是因为清理软件会根据TEMP环境变量来判断现有临时文件夹的 ...

  2. nginx location 匹配 多个规则_你需要知道的Nginx配置二三事

    Nginx是俄罗斯人Igor Sysoev基于C语言编写的十分轻量级的HTTP服务器,它主要有以下特点: 它是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器 ...

  3. nginx location 匹配 多个规则_后端程序员不得不会的 Nginx 转发匹配规则

    一.正则表达式匹配 ~ 为区分大小写匹配 ~* 为不区分大小写匹配 !~ 和 !~* 分别为区分大小写不匹配及不区分大小写不匹配 二.文件及目录匹配 -f 和 !-f 用来判断是否存在文件 -d 和 ...

  4. 弄懂 Nginx location 匹配

    location 指令是 nginx 中最关键的指令之一,location 指令的功能是用来匹配不同的 URI 请求,进而对请求做不同的处理和响应,这其中较难理解的是多个 location 的匹配顺序 ...

  5. nginx 指向一个文件夹_弄懂nginx的语法就是这么简单

    "写给自己看,说给别人听."nginx应该是我们常用到的一个软件了,它的用法和语法也很简单,本文主要介绍nginx语法以及常用命令. Nginx配置目录 当我们安装好nginx之后 ...

  6. 倾向得分匹配的stata命令_培训对工资是否影响显著:倾向得分匹配法(PSM)及stata实现...

    第一部分   模型背景 1.研究目的 2.基本思想 第二部分   数据介绍以及语法简介 1.数据介绍 2.语法格式 第三部分   案例讲解以及stata实现 1.变量介绍以及数据描述性统计 2.倾向匹 ...

  7. 耳机接口规则_耳机小白必读 一分钟看懂什么是TRS接口

    新酷产品第一时间免费试玩,还有众多优质达人分享独到生活经验,快来新浪众测,体验各领域最前沿.最有趣.最好玩的产品吧~!下载客户端还能获得专享福利哦! 当我们在使用数码音频产品时,往往面对的第一件事情就 ...

  8. matlab求传递函数在某个频率点的增益_【干货分享】轻松弄懂开关电源TL431环路补偿传递函数推导...

    微信公众号:硬核电子. 开关电源常用的TL431环路接法是使用2型补偿器,本文将对这种补偿环路的原理进行说明,并推导传递函数,加深理解的同时,给实际电路设计提供理论指导.本文如有谬误之处,欢迎指正. ...

  9. python运行方式特点_编程必修课:一文弄懂python的运行机制

    Python的维基百科说明:"是一种广泛使用的解释型,高级编程,通用型语言,具有动态类型和垃圾回收功能,能够自动管理内存使用" Python的设计哲学:优美优于丑陋,明了优于隐晦 ...

最新文章

  1. shell 中柏开机显示efi_中柏 ezpad 平板安装Fedora 21 (Linux)
  2. 将做好的py文件打包成模块,供别人安装调用
  3. 你的 A/B 测试数据期骗你了吗?
  4. mac golang grpc proto pb文件生成go文件.md
  5. 如何在Hibernate Search 5.5.2 / Apache Lucene 5.4.x中处理停用词?
  6. java char指针数组_简单总结C语言中各种类型的指针的概念
  7. 通过ssh方式clone项目_参与开源项目流程
  8. 基于jQ+CSS3页面滚动内容元素动画特效
  9. 男27,想转行互联网,是学习软件测试好,还是前端编程?
  10. fastica的matlab工具箱,FastICa matlab工具箱使用说明
  11. KEIL4与KEIL5护眼配色方案
  12. SDIO接口(4)——SDIO通信
  13. Directx 9在vs2008 里面的环境配置
  14. 《人生只有一次,去做自己喜欢的事》读书笔记
  15. ajax跨域获取cookie,ajax跨域获取cookie信息(示例代码)
  16. seo快排可视化界面封装,一键运行。
  17. word 文档在左侧显示文档的目录结构的方法
  18. ​人工智能能否跨越意识鸿沟?
  19. 从搬砖工到亿万富豪,这些年他经历了什么?
  20. Firework导航栏字体变大方法

热门文章

  1. 清华90后女博士后:攻克了世界难题,却无法让父母明白我在做什么
  2. 年薪50万,他们招180名博士
  3. 循环机换变速箱油教程_变速箱油用循环机换还是重力换更好?一次讲清楚,新手司机学学...
  4. php取消转译代码,PHP在我不需要的时候进行转义
  5. java选课系统_java实现学生选课系统
  6. Ubicomp一些有意思的论文
  7. Linux SO_KEEPALIVE属性,心跳
  8. 【使用注意】多线程导致解码混乱的情况
  9. 【转载保存】获取页面编码
  10. 庖丁解牛|图解 MySQL 8.0 优化器查询转换篇