程序员从入门到放弃Java技术升华技术干货

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

2018-06-16  本文已影响46人  虾游于海

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生效。

谨以此献给踩过坑的人

上一篇下一篇

猜你喜欢

热点阅读