码迷,mamicode.com
首页 > 其他好文 > 详细

掌握nginx的location优先级

时间:2018-11-24 18:57:39      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:命令   events   out   shadow   http   list   ESS   proxy   default   

  • 前言
    近几年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的放置位置。

    掌握nginx的location优先级

    标签:命令   events   out   shadow   http   list   ESS   proxy   default   

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

    (0)
    (0)
       
    举报
    评论 一句话评论(0
    登录后才能评论!
    © 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
    迷上了代码!