Nginx location正则匹配是URL精细化分流核心,需正确选用~或~*、设计正则、注意优先级及捕获组使用;匹配顺序按配置出现先后,首个成功者生效。

Nginx 的 location 块支持正则匹配,是实现 URL 级别精细化分流的核心机制。关键在于正确选用匹配符、合理设计正则表达式,并注意匹配优先级和变量捕获的使用。
理解 location 正则匹配符
Nginx 中以 ~(区分大小写)或 ~*(不区分大小写)开头的 location 会启用 PCRE 正则匹配:
-
location ~ ^/api/v1/users/\d+$—— 匹配如/api/v1/users/123,区分大小写 -
location ~* \.(jpg|png|gif)$—— 匹配图片资源,忽略大小写(如.JPG也生效) - 注意:
^~和=是前缀匹配,不走正则;正则匹配优先级低于精确匹配(=)和最长前缀匹配(^~),但高于普通前缀匹配(location /xxx)
用捕获组实现动态代理或重写
正则中的括号 () 可捕获路径片段,通过 、 等变量在后续指令中引用:
-
location ~ ^/app/([a-z]+)/v(\d+)/(.+)$ { proxy_pass http://backend-$1-$2/$3; }将/app/web/v2/static/js/app.js转发到http://backend-web-2/static/js/app.js -
location ~* ^/static/(css|js)/(.+)\.(\d+)\.(css|js)$ { rewrite ^/static/([^/]+)/.+\.(\d+)\.(css|js)$ /static/$1/$2.$3 last; }去掉版本号(如main.12345.css→main.css),便于缓存管理
结合 if 判断做复合条件分流(慎用但必要时有效)
纯 location 正则无法直接判断查询参数或请求头,此时可在正则匹配的 location 内嵌 if 做二次筛选(注意:if 在 location 中是安全的):
location ~ ^/admin/ { if ($args ~* "debug=1") { set $debug_mode "on"; } if ($http_user_agent ~* "curl|httpie") { return 403; } proxy_pass http://admin_backend; }- 更推荐方式:用
map提前定义变量(性能更好),再在 location 中引用,例如:map $arg_env $upstream { default backend-prod; "dev" backend-dev; "staging" backend-staging; }location /service/ { proxy_pass http://$upstream; }
避免常见陷阱
正则分流易出错,需特别留意:
- 正则末尾未加
$可能误匹配(如~ /api/user会匹配/api/userinfo,应写成~ ^/api/user$或~ ^/api/user/?) - 特殊字符(
.、?、+、*)必须转义,否则按正则含义解析(.匹配任意字符,想匹配字面量点要用\.) - 多个正则 location 之间无顺序关系,Nginx 总是选取**第一个匹配成功的**(按配置文件出现顺序),不是最长或最具体者胜出
- 不要在正则 location 中直接写
root,容易因路径拼接出错;优先用alias(注意末尾斜杠)或显式指定完整路径


















