^~ 是带中断语义的前缀匹配,匹配成功即终止后续正则检查;适用于静态资源、api 前缀等明确路径的高效路由,优先级仅次于精确匹配 =。

用 ^~ 是为了在前缀匹配阶段“提前终止匹配流程”,避免后续正则表达式干扰,适用于静态资源、API 前缀等明确路径的高效路由。
^~ 的作用机制
^~ 不是正则,也不是通配符,它本质是带中断语义的前缀匹配。一旦某个 location 使用 ^~ /static/ 并成功匹配请求 URI(比如 /static/css/app.css),Nginx 就立即选用该块配置,并跳过所有后续的 ~ 或 ~* location 块——哪怕那些正则更“贴切”也不会执行。
这和普通前缀匹配(如 location /static/)的关键区别在于:后者仍会继续检查是否有正则能匹配,而 ^~ 一锤定音。
什么时候该用 ^~
- 服务大量静态文件(如
/images/、/css/、/js/),且你已用alias或root正确映射到磁盘路径 - 代理固定前缀的后端服务(如
^~ /api/v1/→ 转发给上游http://backend:8000/v1/),不希望被~ \.php$之类规则误捕获 - 需要屏蔽某类路径的正则处理逻辑(例如防止
~* \.(jpg|png)$影响/uploads/下的动态生成图)
正确写法与常见误区
写法必须严格:^~ 后紧跟斜杠开头的纯路径字符串,不能含正则元字符(如 ^~ /user/\d+ 是错的,\d+ 在这里不生效)。
示例:
✅ 推荐:location ^~ /assets/ { alias /var/www/static/assets/; }
❌ 错误:location ^~ /assets/.* { ... }(^~ 不支持正则语法)
⚠️ 危险:location ^~ /admin —— 它会同时匹配 /admin 和 /admin-login,应写成 location ^~ /admin/ 或加精确匹配 location = /admin
和其他匹配类型的协作关系
^~ 的优先级排第二,仅低于 =。这意味着:
- 若存在
location = /assets/,它会优先生效(但只匹配完全相等的 URI) - 若没有
=,且有多个^~,Nginx 按最长前缀选择(如^~ /assets/js/优先于^~ /assets/) - 只要
^~匹配成功,后面所有~、~*都不再评估,不管它们写在配置前面还是后面











