nginx location匹配严格按五类优先级顺序:=(精确)、^~(前缀终止)、~和~*(正则从上到下)、普通前缀(最长匹配)、/(兜底);顺序错乱会导致404、代理错位等问题。

nginx 的 location 匹配不是“谁写在前面就用谁”,而是严格按五类规则的优先级逐层筛选。搞清这个顺序,能避免 90% 的 404、代理错位和缓存失效问题。
精确匹配(=):最高优先级,一锤定音
只匹配完全一致的 URI,不接受任何额外字符,也不支持正则。它性能最优、行为最确定。
- 适合健康检查接口、固定跳转页、关键静态文件(如 /favicon.ico 或 /robots.txt)
- 示例:
location = /health { return 200 "ok"; }—— 只响应 /health,/health/ 或 /health?x=1 都不命中 - 注意:= /admin 不会匹配 /admin/ 或 /admin/login,如需包含子路径,得用其他修饰符
前缀匹配(^~):静态资源首选,匹配即止
以指定路径开头即匹配,且一旦命中,Nginx 就不再检查后续所有正则规则(~ 和 ~*),大幅提升性能。
- 最适合托管 /static/、/assets/、/images/ 等高频静态目录
- 示例:
location ^~ /static/ { root /var/www/app; expires 1y; }—— /static/css/app.css 会走此规则,即使后面还配置了location ~ \.css$也不会触发 - 关键点:^~ 比普通前缀(无修饰符)优先级高,也比所有正则高;但它不支持通配或变量,纯字符串前缀
正则匹配(~ 和 ~*):灵活但顺序敏感
区分大小写(~)或不区分(~*),按配置文件中出现的**从上到下顺序**匹配,首个命中即生效,其余忽略。
- 适合按扩展名分类处理:图片、字体、API 路径、前端路由 fallback
- 示例:
location ~* \.(js|css|woff2?)$ { add_header Cache-Control "public, max-age=31536000"; } - 陷阱:如果上面有 ^~ /api/,那么 /api/v1/users.js 会走前缀规则而非正则——因为 ^~ 优先级更高,且已终止正则检查
- 建议:高频正则靠前写;避免重叠逻辑,比如不要同时用 ^~ /img/ 和 ~* \.png$ 处理同一类请求
普通前缀匹配与兜底(/):最长优先,最后托底
无修饰符的 location /path 按最长前缀原则匹配;而 location / 是默认兜底,匹配所有未被前述规则捕获的请求。
- 多个普通前缀时,选 URI 中**最长匹配段**的那个。例如同时存在
location /blog和location /blog/post,请求 /blog/post/2024 会命中后者 -
location /应放在最后,通常配合 proxy_pass 或 try_files 做后端代理或 SPA 路由 fallback - 注意斜杠含义:location /api 会匹配 /api、/api/、/api/users;若只想匹配目录本身,应写
location = /api { ... }或location /api/ { ... }











