Nginx location匹配规则优先级详解 Nginx
前言
多个 location 写在一起,到底命中哪一个?Nginx 的 location 匹配有严格优先级:精确、前缀、正则按书写顺序。搞混会导致规则不生效或被错误覆盖。本文讲解匹配类型、优先级顺序、常见冲突和调试方法。
操作步骤
1. 匹配类型与优先级(从高到低)
- = 精确匹配:
location = / - ^~ 前缀匹配(命中后不再找正则)
- ~ 或 ~* 正则匹配(区分/不区分大小写,按书写顺序)
- 普通前缀匹配(最长前缀)
2. 精确匹配首页
location = / {
root /var/www/html;
}
3. 前缀优先,跳过正则
location ^~ /static/ {
root /var/www;
}
4. 正则按书写先后
location ~* \.(css|js)$ { ... }
location ~* \.(jpg|png)$ { ... }
5. 普通前缀兜底
location / {
proxy_pass http://backend;
}
6. 调试匹配命中
nginx -T 2>/dev/null | grep -A3 location
常见坑
- 普通前缀和正则同时满足,正则优先级更高,前缀被覆盖。
- ^~ 和 = 优先级高于正则,常用于静态目录。
- 正则按书写顺序,第一个命中就停,顺序影响结果。
- 漏写 ~* 的 i,大写扩展名匹配不到。
- location / 写在前面,被当作普通前缀但不抢先。
- 别名 alias 与 root 混用导致路径错误。
- 多层 location 继承,内层规则覆盖外层。
总结
优先级:= > ^~ > 正则(~ ~*)按顺序 > 普通前缀。静态资源用 ^~ 抢在正则前,正则注意书写顺序和大小写。调试时用 nginx -T 看最终生效配置,别只看源码。
遇到问题加QQ23979811 协助处理