阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

掌握Nginx的location优先级

217次阅读
没有评论

共计 2146 个字符,预计需要花费 6 分钟才能阅读完成。

前言

近几年 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 / 是通配的,也就是所以请求都能匹配,但它的优先级我们暂时还不知道。请求结果如下:

掌握 Nginx 的 location 优先级

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

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

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

掌握 Nginx 的 location 优先级

location 正则的优先级测试,我们加入~ ^/test,使用正则匹配以 test 开头的

            location / {
                    return 400;
            }
            location /test {
                    return 401;
            }
            location ~ ^/test {
                    return 402;
            }

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

掌握 Nginx 的 location 优先级

多个正则的优先级测试,我们使用两个正则,主要是来验证下,是不是正则配置得越多,优先级就越高。如下的配置

          location ~ ^/test {
                    return 402;
            }

            location ~ ^/test/aaa {
                    return 403;
            }

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

掌握 Nginx 的 location 优先级

我们加入精准匹配,也就是 nginx 的 =,我们来测试下精准匹配的优先级

            location ~ ^/test/aaa {
                    return 403;
            }

            location = /test/aaa {
                    return 404;
            }

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

掌握 Nginx 的 location 优先级

问题 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 的放置位置。

总结如下:

1 匹配优先级如下

① = 精确匹配
② ^~ 优先匹配常规字符串,匹配后,不检查正则
③ ~* 正则匹配 示例:~*.(gif|jpg|jpeg)$
④ / documents/ 匹配常规字符 documents 代表目录,可以是其他值
⑤ / 所有 location 无法匹配,则显示该默认匹配

以上可以都有,也可以都没有,如果都有,则按照以上优先级匹配。

2 匹配的时候如果有正则,如上面③的示例,则网址最后一项是.gif 即可匹配成功,在.gif 前面的目录是不存在的也能匹配。

/documents 如果要匹配成功,上级目录必须是存在的。

3 正则写法必须有~ 或~* 否则无效

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计2146字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中