专栏首页Laoqi's Linux运维专列nginx的location优先级

nginx的location优先级

在nginx配置文件中,location主要有这几种形式:

  1. 正则匹配 location ~ /abc { }
  2. 不区分大小写的正则匹配 location ~* /abc { }
  3. 匹配路径的前缀,如果找到停止搜索 location ^~ /abc { }
  4. 精确匹配 location = /abc { }
  5. 普通路径前缀匹配 location /abc { }

优先级

4 > 3 > 2 > 1 > 5


解释一下各个格式:

location = / {
# 精确匹配 / ,主机名后面不能带任何字符串
[ configuration A ]
}
location / {
# 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
# 但是正则和最长字符串会优先匹配
[ configuration B ]
}
location /documents/ {

# 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
[ configuration C ]
}
location ~ /documents/Abc {

# 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
[ configuration CC ]
}
location ^~ /images/ {

# 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {

# 匹配所有以 gif,jpg或jpeg 结尾的请求
# 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则
[ configuration E ]
}
location /images/ {

# 字符匹配到 /images/,继续往下,会发现 ^~ 存在
[ configuration F ]
}
location /images/abc {

# 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在
# F与G的放置顺序是没有关系的
[ configuration G ]
}
location ~ /images/abc/ {

# 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用
[ configuration H ]
}

再来分析一下A-H配置的执行顺序。

  1. 下面2个配置同时存在时
location = / {
[ configuration A ]
}

location / {
[ configuration B ]
}

此时A生效,因为=/优先级高于/
  1. 下面3个配置同时存在时:
location  /documents/ {
[ configuration C ]
}

location ~ /documents/ {

[configuration CB]

}

location ~ /documents/abc {
[ configuration CC ]
}

当访问的url为/documents/abc/1.html,此时CC生效,首先CB优先级高于C,而CC更优先于CB
  1. 下面4个配置同时存在时
location ^~ /images/ {
[ configuration D ]
}

location /images/ {
[ configuration F ]
}

location /images/abc {
[ configuration G ]
}

location ~ /images/abc/ {
[ configuration H ]
}

当访问的链接为/images/abc/123.jpg时,此时D生效。虽然4个规则都能匹配到,但^~优先级是最高的。

若^~不存在时,H优先,因为~/images/ > /images/

而/images/和/images/abc同时存在时,/images/abc优先级更高,因为后者更加精准
  1. 下面两个配置同时存在时
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}

location ~ /images/abc/ {

[ configuration H ]
}

当访问的链接为/images/abc/123.jpg时,E生效。因为上面的规则更加精准。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • LVS的Full-NAT模式

    老七Linux
  • CentOS下利用mysqlbinlog恢复MySQL数据库

    老七Linux
  • Zabbix 监控交换机

    如果我们需要监控打印机、路由器、UPS等设备,肯定不能使用zabbix agentd,因为他们不能安装软件的,还好他们一般都支持SNMP协议,这样我可以使用SN...

    老七Linux
  • 全文搜索实战2-ik分词及搜索高亮

    数据存储功能基于mybatisplus框架,实现相关entity和mapper等即可。

    技术路漫漫
  • 【小家Spring】Spring AOP中@Pointcut切入点表达式最全面使用介绍

    标准的AspectJ Aop的pointcut的表达式类型是很丰富的,但是Spring Aop只支持其中的9种,外加Spring Aop自己扩充的一种一共是11...

    YourBatman
  • 松本行弘:Ruby之父是怎样炼成的?

    当对一样事物着迷到了不能自拔的地步,就可以称之为痴。正如练武有武痴,演戏有戏痴,在程序员的世界里,也有这样一位“语言痴”——松本行弘。

    友好速搭小编
  • 聊聊spring cloud gateway的NettyConfiguration

    本文主要研究下spring cloud gateway的NettyConfiguration

    codecraft
  • 自己写一个DropDownList控件

    静心物语313
  • Java-内部类

    如果想从外部类的非静态方法之外的任意位置创建某个内部类的对象(在静态方法内部创建某个内部类的对象),那么必须像在main()方法中那样,具体地指明这个对象的类型...

    桑鱼
  • C#构造方法--实例化类时初始化的方法

    using System; using System.Collections.Generic; using System.Linq; using System....

    杨奉武

扫码关注云+社区

领取腾讯云代金券