大家好,我是 17。
今天和大家详细聊聊 nginx 的 location 匹配规则
location 匹配规则
@ 匹配规则在后面的 try_files 中有举例
location 按如下优先级匹配
- = 绝对匹配,一个字符也不能差
- ^~ 前缀匹配
- ~(区分大小写), ~*(不区分大小写) 正则匹配
- 普通前缀匹配
2,4的匹配是匹配最长优先。
3 的匹配是按顺序,写在前面的优先。
完全匹配
location = /abc {
return 900;
}
curl -I localhost:3000/abc
HTTP/1.1 900
location = abc 虽然只少了 / ,但这样是匹配不到的,一个字符也不能差。完全匹配优先级最高,无论写在前面还是后面。
^~ 前缀匹配
# 正则匹配
location ~ abc {
return 900;
}
# 前缀匹配
location ^~ /a {
return 901;
}
curl -I localhost:3000/abc
HTTP/1.1 901
^~ 匹配的优先级高于正则匹配。
初看到 ^~ 的人会误以为是正则匹配。这个要注意下,这个是前缀匹配,就是从前向后一个字符一个字符匹配。
# 普通前缀匹配
/abc/ {
}
# 前缀匹配
^~ /abc/ {
}
这两种写法的匹配方式是一样,^~ 的优先级更高。
正则匹配
# 普通前缀匹配
location /abcd {
return 901;
}
# 正则匹配
location ~ /ab {
return 902;
}
curl -I localhost:3000/abcd
HTTP/1.1 902
正则匹配的优先级高于普通前缀匹配。
# 正则匹配
location ~ /ab {
return 901;
}
# 正则匹配
location ~ /abc {
return 902;
}
curl -I localhost:3000/abc
HTTP/1.1 901
正则匹配是按顺序来的,前面的匹配成功,后面的就不再匹配了。
从性能上来说,尽量不要用正则,正则匹配性能最低。
前缀匹配最长优先
location /abcd {
return 901;
}
location /abc {
return 902;
}
location ^~ /def {
return 903;
}
location ^~ /defg {
return 904;
}
curl -I localhost:3000/abcd
HTTP/1.1 901
curl -I localhost:3000/defg
HTTP/1.1 904