nginx 匹配路径_nginx中的location路径匹配规则和优先级

nginx中location配置项是最基础的配置,而且它的配置也稍显复杂。

我查找了一些网上的中文博客,很多同学都没有正确的表述出配置的关键点,于是回头用我自己过了2级的英语仔细的阅读了一下nginx的官方文档。将自己的理解记录下来。

location的匹配语法如下

location [ = | ~ | ~* | ^~ ] uri { ... }

它包含了路径的匹配规则和针对该规则的配置。

规则按照前导符主要分五类

前导符

说明

= uri {...}

全字匹配,只有当请求路径和uri完全匹配时,对应的规则才会生效

~ regular {...}

区分大小写的正则匹配

~* regular {...}

不区分大小写的正则匹配

^~ uri {...}

否定正则的路径匹配

url {...}

没有任何前导符的路径匹配

这五类规则,同时存在配置文件中时,按照一定的优先级规则生效。

nginx规则决定流程如下图

image.png

文字说明:

以下说明非常关键

一、检查请求uri是否与某个=规则匹配,如果有,直接应用规则,终止后续匹配。

二、nginx首先检查所有路径匹配规则配置项,包括"^~"规则和没有前导符号的规则,选择并记住和当前请求uri匹配度最长的配置项。但这个时候,并不会启用相关的配置,而仅仅是记住。

三、判断上一步中选择下来的路径规则是否包含 ^~ ,如果包含,则使用该条规则,终止后续匹配。

四、按配置顺序进行正则表达式检查,匹配到第一条合适的正则表达式时,使用该条规则,终止后续匹配。

五、使用步骤三选择出来的路径匹配规则。

来一段官方的原文示例

location = / {

[ configuration A ]

}

location / {

[ configuration B ]

}

location /documents/ {

[ configuration C ]

}

location ^~ /images/ {

[ configuration D ]

}

location ~* \.(gif|jpg|jpeg)$ {

[ configuration E ]

}

The “/” request will match configuration A, the “/index.html” request will match configuration B, the “/documents/document.html” request will match configuration C, the “/images/1.gif” request will match configuration D, and the “/documents/1.jpg” request will match configuration E.

在来一段自己的踩坑示例

location /abc {

[ configuration A ]

}

location ^~ /abc {

[ configuration B ]

}

location ~* \/abc\/\.(html)$ {

[ configuration C ]

}

给定请求/abc/index.html

此时应该是configuration B生效

删除B则C生效

删除C,则是A生效。

谨以此献给踩过坑的人

你可能感兴趣的:(nginx,匹配路径)