正则匹配路径需用~(区分大小写)或~*(不区分),配合^$锚定、1+限制层级,注意location不匹配查询参数;优先级上先最长前缀再按配置顺序匹配正则,调试用nginx -t和日志验证。/ ↩

直接用 ~ 或 ~* 修饰符写正则表达式,就能满足大多数复杂路径需求。关键是写准模式、理清优先级、避开常见陷阱。
正则匹配的基本写法
区分大小写用 ~,不区分用 ~*,后面紧跟正则模式,不用引号:
-
location ~ ^/api/v[1-3]/users/\d+$ { ... }→ 匹配/api/v1/users/123,但不匹配/api/v4/users/456 -
location ~* \.(js|css|woff2?)$ { expires 1y; }→ 统一处理前端静态资源,忽略大小写 -
location ~ ^/download/[^/]+\.zip$ { add_header Content-Disposition "attachment"; }→ 确保路径中无子目录,且以 .zip 结尾
多条件组合与边界控制
正则里用 ^ 和 $ 锁定开头结尾,避免误匹配;用 [^/] 限制层级,防止越界:
- 想只匹配
/blog/2024/01/post.html这类扁平结构,不匹配/blog/2024/01/sub/page.html?写成:location ~ ^/blog/\d{4}/\d{2}/[^/]+\.html$ { ... } - 要排除带查询参数的请求(如
/search?q=test)?注意:Nginx 的 location 不匹配 query string,它只看 URI path。若需判断参数,得用if ($args ~ q=)配合内部重写,但慎用if。
和前缀规则共存时的优先级要点
正则不会“自动赢过”前缀匹配。Nginx 先找最长前缀(含 ^~),再按配置顺序扫正则。所以:
- 如果写了
location ^~ /static/ { ... },哪怕后面有location ~ \.js$ { ... },访问/static/app.js也只会走^~规则,正则根本不会触发 - 想让某类文件(如所有
.php)一定走 FastCGI,就把它放在配置靠前位置,并确保没有更长的^~覆盖该路径 - 多个正则都可能匹配时,谁在配置文件里写在前面,谁生效——顺序即优先级
调试与验证技巧
正则写完别急着 reload,先验证逻辑是否符合预期:
- 用
nginx -t检查语法,但不校验正则语义是否合理 - 开启
error_log /path/to/log notice;,配合log_not_found on;,观察实际命中了哪个 location - 临时加一条
return 200 "hit: $uri";到目标 location 中,curl 测试返回内容,快速确认路径是否进对块


















