location常用匹配
- = :精准匹配
- ~ :正则匹配
- ~* :正则匹配,不区分大小写
- ^~ : 普通字符匹配, ^~ 的含义是如果命中,则不会再进行任何的正则匹配
- 前面没有任何修饰: 普通字符匹配
location匹配顺序
- 精确匹配
- 普通匹配
- 正则匹配
看到这里大家可能会有点疑问,有可能会跟现有认知上有些冲突,没关系,继续看完。。
匹配规则
- 首先进行精准匹配,如果匹配上则停止匹配
- 进行最大普通匹配,如果匹配到:
- 假如加了前缀^~,则停止匹配
- 假如为普通匹配,则继续进行步骤3
进行正则匹配
其中,在普通匹配时要遵循最大长度匹配原则。然后在正则匹配时,只要匹配一次就停止后续的匹配。所以在这里,假如为普通字符匹配(无
^~
修饰符的匹配),会继续执行正则匹配,假如正则匹配上,那么正则匹配就会覆盖普通匹配,所以也就是所谓的正则优先
。
匹配陷阱
1.例如有以下配置:
location = / {
root /var/html;
index index.html;
}
location / {
root /var1/html;
index index.html;
}
当访问http://localhost/
时,首先匹配的是第一个精准匹配,由于/
表示的是目录,所以nginx重新将请求转向到http://localhost/index.html
,此时第一个匹配不成功,于是匹配到了第二个location。
2.然而如下配置:
location = /acom {
root html;
index index.html index.htm;
}
location / {
root html;
index index.html;
}
当访问http://localhost/acom
的时候,直接返回第一个匹配结果中的index.html。
这是实验结果,具体原因还需要继续探究。