规则语法

语法 匹配规则
普通匹配(遵循最大前缀匹配规则, 优先度比正则低)
= 精确(严格)匹配, 优先度最高
后续不再匹配正则
^~ 非正则匹配(依然遵循最大前缀匹配规则)
后续不再匹配正则
~ 表示区分大小写的正则匹配
~* 表示不区分大小写的正则匹配
/ 通用匹配,任何请求都会匹配到(本质上等同于语法 )

!~!~* 分别为区分大小写不匹配及不区分大小写不匹配 的正则, 但是是用于条件判断的时候(即 if 语句)

if ($host !~* "^www\.") {
# ...
}

匹配简单来说:

  1. 优先匹配 = 精确匹配, 若未匹配到则转下一步骤

  2. 依照最大前缀匹配规则, 先匹配普通规则( , ^~)

    若最终匹配到 ^~, 则使用

    若匹配到 或 未匹配到, 则转下一步骤(当前匹配结果暂时保存)

  3. 按照物理存储顺序, 若匹配到任意一条正则, 马上使用(无视后面正则)

    若未匹配到任意正则, 则使用步骤2中匹配到普通正则

location 分类

只有两类:正则location和普通location

~~* 为正则location

=^~@和无任何前缀的都属于普通location,另外,@是用作服务端内部的一种转发行为,很少用,在此不做讨论。

匹配顺序:

  1. 先普通,再正则
  2. 普通location之间的匹配顺序:按最大前缀匹配

    location /a/{}location /a/b/ {},请求 http://a/b/c.html 匹配的是 location /a/b/ {}
  3. 正则location之间的匹配顺序:按配置文件中的物理顺序匹配,只要匹配到一条正则,就不再考虑后面的
  4. 若普通location匹配到 精确匹配= 或 非正则匹配 ^~, 则不再进行后续的正则匹配
  5. 普通location与正则location之间的匹配结果选择
    1. 普通location先匹配,匹配到了结果,只是一个临时结果;
    2. 会继续正则location的匹配,
      1. 如果匹配到正则,则用匹配到的正则结果;
      2. 如果没有匹配到正则,则继续用普通匹配的那个结果

综上,常规的顺序是匹配完普通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匹配规则的更多相关文章

  1. [整理] Nginx Location 匹配规则

    目录 规则语法 location 分类 匹配顺序: 扩展 location / {}和 location =/ {}的区别 如何快速测试 规则语法 语法 匹配规则 空 普通匹配(遵循最大前缀匹配规则, ...

  2. nginx location匹配规则

    谢谢作者的分享精神,原文地址:http://www.nginx.cn/115.html location匹配命令 ~      #波浪线表示执行一个正则匹配,区分大小写~*    #表示执行一个正则匹 ...

  3. 转:nginx location匹配规则

    location匹配命令 ~      #波浪线表示执行一个正则匹配,区分大小写~*    #表示执行一个正则匹配,不区分大小写^~    #^~表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配 ...

  4. 【转】nginx location匹配规则

    转载请保留:http://www.nginx.cn/115.html location匹配命令 ~      #波浪线表示执行一个正则匹配,区分大小写~*    #表示执行一个正则匹配,不区分大小写^ ...

  5. Nginx location 匹配规则详解

    语法规则 location [=|~|~*|^~] /uri/ { … } 模式 含义 location = /uri = 表示精确匹配,只有完全匹配上才能生效 location ^~ /uri ^~ ...

  6. Nginx location 匹配规则

    1. default_server: 当请求没有匹配到服务器中配置的任何一个server的时候,会默认把请求route到配置了default_server的virtual host中.参考地址:htt ...

  7. Nginx之location 匹配规则详解

    有些童鞋的误区 1. location 的匹配顺序是“先匹配正则,再匹配普通”. 矫正: location 的匹配顺序其实是“先匹配普通,再匹配正则”.我这么说,大家一定会反驳我,因为按“先匹配普通, ...

  8. 前端开发掌握nginx常用功能之server&location匹配规则

    nginx主要是公司运维同学必须掌握的知识,涉及到反向代理.负载均衡等服务器配置.前端开发尤其是纯前端开发来说对nginx接触的并不多,但是在一些情况下,nginx还是需要前端自己来搞:例如我们公司的 ...

  9. nginx多虚拟主机优先级location匹配规则及tryfiles的使用

    nginx多虚拟主机优先级location匹配规则及tryfiles的使用 .相同server_name多个虚拟主机优先级访问 .location匹配优先级 .try_files使用 .nginx的a ...

随机推荐

  1. [Training Video - 5] [Groovy Script Test Step - Collections, Exceptions] Array and ArrayList

    Array: def x = new String[5] x[0] = "India" x[1] = "USA" x[2] = "Korea" ...

  2. 已经安装Silverlight新版本,无法安装。

    已经安装Silverlight新版本,无法安装.该如何解决? 网上说得很乱,不管他们怎么说,还是没说清楚如何删除这个runtime!! 反正打开>控制面板>添加删除程序>找到Sliv ...

  3. line-height:150% 和 line-height:1.5

    line-height属性的细节与大多数CSS属性不同,line-height支持属性值设置为无单位的数字.有无单位在子元素继承属性时有微妙的不同. 有单位(包括百分比)与无单位之间的区别有单位时,子 ...

  4. Npoi List DataTable导出一个Excel多个sheet 下载

    参考: http://blog.csdn.net/zhouqinghe24/article/details/8649346 参考下载http://www.cnblogs.com/dyllove98/a ...

  5. B-spline Curves 学习之B样条曲线定义(4)

    B-spline Curves: Definition 本博客转自前人的博客的翻译版本,前几章节是原来博主的翻译内容,但是后续章节博主不在提供翻译,后续章节我在完成相关的翻译学习. (原来博客网址:h ...

  6. 【树状DP】星象仪

    题目描述 在寂寞的夜里,星象仪是非常浪漫的东西.但是,你作为一个精神稍微有点不太正常的Geek,把原本正常的星象仪改造得像电报发送器一样.当然,你这个的构造还要更加奇葩一点.具体来说,你的星象仪是一棵 ...

  7. 自我介绍及注册github和上传文件

    自我介绍: 周侃 年龄20 喜好:玩游戏,赚钱,交际 理想:想要改变中国手游界颓靡的时代,让它进入新次元. 注册github,以及上传文件: 今天给大家来讲解下如何注册githup 当我们打开gith ...

  8. 在权限受限制的AD域环境中部署SQL Server AlwaysOn高可用性

    最近在给一个客户部署基于微软TFS的软件生命周期管理平台时,客户要求数据库层实现高可用性,减少因数据库服务器故障影响软件开发进展. 客户现有域是一台搭建在Windows Server 2008上的级别 ...

  9. [JAVA]java复制文件的4种方式

    尽管Java提供了一个可以处理文件的IO操作类. 但是没有一个复制文件的方法. 复制文件是一个重要的操作,当你的程序必须处理很多文件相关的时候. 然而有几种方法可以进行Java文件复制操作,下面列举出 ...

  10. WPF 平板上按钮点击不触发,鼠标点击触发的两种解决方法

    今天运行在windows平板上的程序,有个功能是弹出子窗体,点弹出窗体的关闭按钮,要点好几次才能触发.网上找了找,也有人与我类似的情形. 解决方法如下: public static void Disa ...