nginx中location配置项是最基础的配置,而且它的配置也稍显复杂。
我查找了一些网上的中文博客,很多同学都没有正确的表述出配置的关键点,于是回头用我自己过了2级的英语仔细的阅读了一下nginx的官方文档。将自己的理解记录下来。
location的匹配语法如下
location [ = | ~ | ~* | ^~ ] uri { ... }
它包含了路径的匹配规则和针对该规则的配置。
规则按照前导符主要分五类
前导符 | 说明 |
---|---|
= uri {...} | 全字匹配,只有当请求路径和uri完全匹配时,对应的规则才会生效 |
~ regular {...} | 区分大小写的正则匹配 |
~* regular {...} | 不区分大小写的正则匹配 |
^~ uri {...} | 否定正则的路径匹配 |
url {...} | 没有任何前导符的路径匹配 |
这五类规则,同时存在配置文件中时,按照一定的优先级规则生效。
nginx规则决定流程如下图
文字说明:
以下说明非常关键
一、检查请求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生效。
谨以此献给踩过坑的人