nginx中~为区分大小写的正则匹配,~*为不区分大小写的正则匹配;二者均在前缀匹配无精确命中后按配置顺序依次尝试,首匹配即生效,且需注意转义特殊字符、锚定边界以提升准确性与安全性。

在 Nginx 中,location 块支持多种匹配方式,其中 ~ 和 ~* 用于开启正则表达式匹配,区别在于是否区分大小写。正确使用它们,能精准控制请求路由,避免误匹配或优先级混乱。
~:区分大小写的正则匹配
以 ~ 开头的 location 表示启用**区分大小写**的 PCRE 正则匹配。Nginx 会按配置顺序逐条检查(但注意:正则 location 的优先级低于前缀匹配中的 = 和 ^~,且所有正则匹配在前缀匹配无精确命中后才开始尝试)。
- 匹配成功即停止搜索,执行该块内的指令(如
proxy_pass、return等) - 常见用法:匹配带版本号的 API 路径、特定后缀的动态资源
- 示例:
location ~ ^/api/v[0-9]+/users$ { ... }只匹配/api/v1/users,不匹配/api/V1/users
~*:不区分大小写的正则匹配
~* 与 ~ 功能一致,唯一区别是忽略字母大小写,适合对 URL 中大小写不确定的场景(如用户输入路径、旧系统兼容)。
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
- 正则语法相同,只是自动添加了
i标志(PCRE 的 case-insensitive flag) - 示例:
location ~* \.(jpg|jpeg|png|gif)$ { expires 1h; }同时匹配.JPG、.png、.JPEG等 - 注意:不要滥用,过度使用正则会影响性能,尤其高并发时;静态文件建议优先用前缀匹配(如
location /static/)
正则 location 的匹配时机和优先级
Nginx 匹配 location 分两阶段:
- 第一阶段:快速查找最长前缀匹配(包括
=精确匹配、^~非正则前缀匹配) - 第二阶段:仅当没有
=或^~完全胜出时,才按配置文件中出现的**顺序**依次尝试所有~和~*正则规则,遇到第一个匹配即停止 - 关键点:正则 location 之间**不比较“更精确”**,只看书写顺序——先写的先试,哪怕后面那条正则更具体也无效
实用编写建议
写正则 location 时要兼顾准确性、可读性和维护性:
- 用
^锚定开头、$锚定结尾,防止意外子串匹配(例如~ \.php$比~ \.php更安全) - 特殊字符如
.、?、+、*必须转义(\.、\?),否则按正则含义解析 - 捕获组(
())可用于$1、$2在后续指令中引用,例如重写路径:location ~ ^/old/(.*)$ { return 301 /new/$1; } - 测试正则是否生效:修改配置后运行
nginx -t,再用curl -I或浏览器验证响应头/状态码










