Nginx location正则匹配需以~或~*开头,按配置顺序逐条匹配且首匹配即停止;仅匹配URI路径部分,须注意转义特殊字符、锚定边界及与=、^~等前缀的优先级关系。

Nginx 的 location 块支持正则匹配,用 ~(区分大小写)或 ~*(不区分大小写)开头即可启用。关键在于理解匹配顺序、作用域和常见写法陷阱。
正则匹配的基本语法
正则匹配必须以 ~ 或 ~* 开头,后面紧跟正则表达式。Nginx 会按配置文件中出现的顺序逐条比对,一旦匹配成功就停止查找(除非使用 ^~ 等前缀干扰优先级)。
-
location ~ \.php$ { ... }—— 匹配以.php结尾的 URI,区分大小写 -
location ~* \.(jpg|jpeg|png|gif)$ { ... }—— 不区分大小写,匹配常见图片后缀 -
location ~ ^/api/v\d+/users/\d+$ { ... }—— 匹配类似/api/v1/users/123的路径
注意转义和特殊字符
正则中大多数字符需按 PCRE 规则处理。斜杠 / 在 location 中不是分隔符,无需额外转义;但点号 .、美元符 $、问号 ?、加号 + 等有特殊含义,要匹配字面值就得加反斜杠。
- 想匹配
/file.name?写成location ~ ^/file\.name$ { ... } - 匹配带查询参数的路径?注意:location 只匹配 URI 的 path 部分,
?xxx和#xxx不参与匹配 - 避免误用
.*开头——它可能意外匹配太多,建议用更精确的锚定,如^/static/
正则与前缀匹配的优先级关系
正则匹配优先级低于 =(精确匹配)和 ^~(最长前缀匹配),但高于普通前缀匹配(如 location /abc { ... })。如果同时存在多个正则,只生效第一个匹配的。
- 先检查所有
=和^~,再按配置顺序扫描正则块 - 即使某正则表达式更“精确”,只要排在后面且前面已有匹配,就不会执行
- 若想确保某个正则生效,把它放在所有普通前缀 location 之后、其他正则之前
实用技巧和常见错误
写正则 location 时,建议加 ^ 和 $ 锚定边界,防止部分匹配;同时配合 return 或 rewrite 明确行为,避免隐式继承导致意料外结果。
- 禁止访问 .git 目录:
location ~ ^/.git { return 403; } - 重写旧 API 路径:
location ~ ^/v1/(.*) { rewrite ^/v1/(.*)$ /api/v2/$1 break; } - 别漏掉
break或last—— rewrite 后是否重新匹配 location 很关键 - 调试时可用
nginx -t检查语法,配合error_log notice查看匹配日志(需开启log_subrequest on或用第三方模块)


















