Nginx location 匹配优先顺序

location 的书写顺序,与匹配方式,都会影响最终匹配结果;没有处理好,会达不到预期。

官方文档:Configuring NGINX and NGINX Plus as a Web Server | NGINX Documentation

nginx的匹配符:

类型符号含义
精确=#用于标准uri前,需要请求字串与uri完全匹配。
普通 #没有符号,且路径是[/xxx],匹配顺序是从长到短,也可以理解为前缀匹配。
默认 #没有符号,且路径为[/],也可以理解为兜底匹配。
前缀匹配方式^~#是前缀匹配,不是正则匹配。与类似SQL中【Like ‘/xxx%’】
正则匹配方式~#区分大小写
正则匹配方式~*#不区分大写
正则匹配方式!~#区分大小写不匹配
正则匹配方式!~*#不区分大小写不匹配
正则表达符号^#匹配正则开头
正则表达符号$#匹配正则结尾
正则表达符号\#转义字符。可以转. * ?等
正则表达符号*#代表匹配0到无限次数,其中【.*】代表任意长度的任意字符
正则表达符号|#代表或者,一般与()一起,比如(ab|bc),代表ab或bc都能匹配成功,但ac不能。
正则表达符号其他符号,比如:+\w[]等,见 正则表达式:认识与基础 – 未名

多个 location 配置的情况下匹配顺序如下表:

优先顺序描述示例
 1首先精确匹配 = ,找到就停止。location = /uri
 2其次前缀匹配:
a)、有 ^~ ,则找到第一个匹配后时停止。受文件中先后顺序影响。
b)、没有 ^~ ,则以匹配长度的,最长的为准。不受文件中先后顺序影响,而且匹配成功会继续做正则匹配。
x)、所以,示例【location /test】与【location ^~ /test】是冲突的,只能二选一使用。
location ^~ /uri
location /uri
 3后按文件中先后顺序,做正则匹配,找到就停止。 注意:
a)、 ~ 优先于 ~*(也就是区分大小写优先)。
b)、在2b有结果,但3没有结果时,则使用2b的结果。
c)、在2b和3都有结果时,使用3的结果。
location ~ pattern location !~ pattern
 4最后是默认的/location /

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注