一张图搞明白Nginx的 / 和 ^~ / 匹配的相同点和不同点
相同点
- 都可以匹配任何以 /xxx 开头的请求 URI
- 都会根据用户请求的URL继续在配置中查找,直到找到最长匹配的;但是如果过程中有正则匹配的时候 /xxx会立即停止,但 ^~ /xxx不会
不同点
优先级不同:
- /xxx 会低于 ^~ /xxxx
- /xxx 会低于 正则匹配
- ^~ /xxxx 会高于正则匹配
例子
例1:查找最长匹配
比如用户访问URL为 /api/front/doc/info
nginx 配置如下
location /api {}
location /api/front {}
location /api/front/doc {}
location /api/front/software/info {}
nginx会先找到 /api的 location;但是会继续去配置中查找,然后找到/api/front的location;然后依次类推最后找到最长的即 location /api/front/doc {}
例2:/xxx 低于 正则匹配
用户请求URL为 /api/font/doc/info
配置如下
location ^~ /api {
return 200 "<html><body>^~ /api </body></html>";
}
location ^~ /api/front {
return 200 "<html><body>^~ /api/front </body></html>";
}
location /api/front/doc {
return 200 "<html><body>^~ /api/front/doc</body></html>";
}
location ~* /api/.* {
return 200 "<html><body>/api</body></html>";
}
虽然 /api/front/doc 是最长匹配的,但因为有正则 ~* /api/.* 匹配了,所以nginx会采用
location ~* /api/.* {
return 200 "<html><body>/api</body></html>";
}
例3:^~ /xxxx 会高于正则匹配
例3:用户请求URL为 /api/font/doc/info
配置如下
location ^~ /api {
return 200 "<html><body>^~ /api </body></html>";
}
location ^~ /api/front {
return 200 "<html><body>^~ /api/front </body></html>";
}
location ^~ /api/front/doc {
return 200 "<html><body>^~ /api/front/doc</body></html>";
}
location ~* /api/.* {
return 200 "<html><body>/api</body></html>";
}
这里Nginx会采用 location ^~ /api/front/doc 因为 ^~ 的匹配符会比正则的匹配优先级高