掌握nginx的location优先级

  • 前言
    近几年nginx在企业上的应用很广泛,但很多朋友还是不知道nginx的location优先级,如果不能清晰的掌握nginx的location优先级,就会在配置nginx的时候引起错误的跳转,错误的跳转往往就是一次严重的线上事故。因此,掌握nginx的location优先级非常重要。
  • 先来一个最简单的nginx配置
    worker_processes  1;
    events {
    worker_connections  1024;
    }
    http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    
    server {
        listen 80;
        location / {
            return 400;
        }
    }
    }
  • location /是通配的,也就是所以请求都能匹配,但它的优先级我们暂时还不知道。请求结果如下:

    • 多个通配的优先级测试,加入location /test

                  location / {
                          return 400;
                  }
                  location /test {
                          return 401;
                  }

      加入location /test,我们故意把位置放到location /以下,来验证优先级。请求结果如下,返回401,从结果可以看出来/test的优先级高于location /。不过用户的访问要以/test开头,不是以/test开头还是命中到location /:

    • location正则的优先级测试,我们加入~ ^/test,使用正则匹配以test开头的
                  location / {
                          return 400;
                  }
                  location /test {
                          return 401;
                  }
                  location ~ ^/test {
                          return 402;
                  }

      加入location ~ ^/test,我们故意再把它放到最后,来验证优先级。请求结果如下,返回402,从结果可以看出来正则的优先级要大于location /和location /test,也就是正则location大于通配location

    • 多个正则的优先级测试,我们使用两个正则,主要是来验证下,是不是正则配置得越多,优先级就越高。如下的配置
                 location ~ ^/test {
                          return 402;
                  }
      
                  location ~ ^/test/aaa {
                          return 403;
                  }

      加入^/test/aaa,我们一样把它放到最后,请求/test/aaa。结果返回402,也就是匹配到第一个正则后,底下的正则不会再去匹配。由于请求/test/aaa,命中^/test,所以底下的正则就无效了:

    • 我们加入精准匹配,也就是nginx的=,我们来测试下精准匹配的优先级
                  location ~ ^/test/aaa {
                          return 403;
                  }
      
                  location = /test/aaa {
                          return 404;
                  }

      我们故意把= /tmp/aaa放到最后,这个只能匹配到/test/aaa的请求,得到的结果如下,返回404。这个说明了,精准匹配=的优先级是最高的,不管它放到哪里。

    • 问题1:为什么我的nginx设置了全局跳转,但怎么不生效?
                  location / {
                          rewrite xxx xxxx;
                  }
      
                  location ~* ^/test {
                          return 402;
                  }

      如果是以上的跳转配置的话,大家根据优先级来,可以发现location /的优先级是最低的,所以全局跳转不生效。因为当用户访问到/test/xx的时候,命中到其它location了。所以全局跳转的话,保留一个location /即可。

    • 问题2:为什么我的nginx动静分离配置失败了?
                  location ~ ^/test {
                          root xxxx;
                  }
      
                  location ~ \.jsp$ {
                          proxy_pass xxxx;
                  }

      如果是以上配置的话,当用户访问到/test/xxx.jsp的时候,就命令到location ~ ^/test了。所以动静分离如果都使用正则的话,需要注意location的放置位置。

    原文地址:http://blog.51cto.com/zhuangweihong/2321502

    时间: 2024-11-08 01:55:42

    掌握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 = / {#

    nginx location优先级详解

    nginx中location有几种: 1.前缀,可以有=或^~修饰,比如 location  /       /开头的 location /img/     /img/开头的 location = /a.htm      刚好/a.htm location ^~ /d    匹配后不再检查正则表达式location.注意这个意思不是非正则表达式!除了~开头其他都是非正则表达式,也就是前缀匹配 2.正则表达式,固定~或~*(不区分大小写)开头,比如: location ~  \.html$ loc

    测试Nginx中location的优先级!

    location [=|~|~*|^~] /uri/ { … } = 开头表示精确匹配 ~ 开头表示区分大小写的正则匹配 ~* 开头表示不区分大小写的正则匹配 ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可.nginx不对url做编码,因此请求为/static/20%/aa, 可以被规则^~ /static/ /aa匹配到(注意是空格). !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则 / 通用匹配,任何请求都会匹配到. 多个location配置的情况下匹配

    Nginx的location配置

    安装第三方模块echo-nginx-module git clone https://github.com/openresty/echo-nginx-module.git./configure --add-module=/nginx安装目录/echo-nginx-modulemake && make install安装之后,可以直接在配置文件中使用 echo '' 命令 location语法 location [=|^~|~|~*] /uri/ { -. }coding.net/u/ami

    Nginx之location 匹配规则详解

    Nginx之location 匹配规则详解 关于一些对location认识的误区 1. location 的匹配顺序是"先匹配正则,再匹配普通". 矫正: location 的匹配顺序其实是"先匹配普通,再匹配正则".我这么说,大家一定会反驳我,因为按"先匹配普通,再匹配正则"解释不了大家平时习惯的按"先匹配正则,再匹配普通"的实践经验.这里我只能暂时解释下,造成这种误解的原因是:正则匹配会覆盖普通匹配(实际的规则,比这复杂,

    nginx 至location

    nginx.conf location   定位 匹配 location =  patt{}  精准匹配 location ~ patt{}  正则匹配 location  patt{}  普通匹配 原文地址:https://www.cnblogs.com/tao-yuan/p/9160268.html

    nginx利用location匹配url中?号后的参数

    nginx利用location匹配url中?号后的参数 http://www.baidu.com/index.php?a=1&b=2location能匹配到url,但是匹配不到url后面的参数,例如:?a=1&b=2 需求:访问地址:https://www.aposoft.com/all-apowersoft/?from=edm 开发要求可不可以只是这个完整地址https://www.aposoft.com/all-apowersoft/?from=edm 跳转到404,然后https:/

    nginx之location匹配优先级和安全问题

    最近一直在做location的配置,遇到优先级别问题(如有配置不当,会存在安全隐患),以下是个人的一些学习体会 一.location 匹配符 1.等于匹配符:      ##"=" 其特点可概括为两点:   ##1.精确匹配,2.不支持正则表达式 语法示例: 1 location = /static/img/file.jpg { 2 3 ... 4 5 } Code-1 2.空  匹配符: 空匹配符的特点是:   ##1.匹配以指定模式开始的URI,2.不支持正则 语法示例: 1 lo

    nginx——location 优先级

    一. location 的匹配符1.等于匹配符:=等于匹配符就是等号,特点可以概括为两点:精确匹配不支持正则表达式2.空匹配符空匹配符的特点是:匹配以指定模式开始的 URI不支持正则表达式3.正则匹配符:~正则匹配符是可以使用正则表达式的匹配符.不过这里要强调的是, 一般来说~是指:区分大小写的正则匹配而~*表示:         不区分大小写的正则匹配但是对于一些对大小写不敏感的操作系统,这两者没有区别. 二.优先级的实例 location ~ ^/poechant$ { return 400