Nginx location匹配优先级为:1. 精确匹配(=)最高,立即终止;2. 带^~的前缀匹配,最长者胜出且跳过正则;3. 正则按配置顺序首个命中即停;4. 普通前缀匹配按最长前缀原则,/为最终兜底。

请求路径匹配的优先级不是按书写顺序,而是由 Nginx 内部硬编码的规则决定。理解这个顺序,才能避免配置冲突、路由错乱或静态资源被正则意外拦截。
精确匹配(=)优先级最高
只匹配完全一致的 URI,不关心查询参数,也不匹配子路径。一旦命中立即终止后续所有匹配。
-
location = /health → 只响应
/health,不响应/health/或/healthz -
location = / → 仅匹配根路径
/,不是所有请求的兜底项 - 适合健康检查、登录页、首页等明确且唯一的入口点
前缀匹配中带 ^~ 的会跳过正则阶段
^~ 不是“更高优先级”,而是“更早阻断”。它和普通前缀匹配都走最长前缀逻辑,但只要最长匹配是 ^~ 类型,Nginx 就不再检查任何正则规则。
-
location ^~ /static/ → 匹配
/static/css/app.css,即使后面有location ~ \.css$也不会生效 - 多个
^~或普通前缀共存时,仍按“最长字符串”胜出,比如/static/js/比/static/更长 - 常用于 CDN 静态目录、上传资源前缀等需稳定、免干扰的路径
正则匹配按配置顺序执行,首个命中即停
区分大小写(~)和不区分(~*)属于同一优先级层级,仅按它们在配置文件中出现的先后顺序检查。
- location ~ \.php$ 和 location ~* \.(jpg|png) 并列第三级,谁写在前面谁先被试
- 建议高频规则靠前,如先写
~* \.(js|css|woff2?)$,再写低频的~ ^/api/v\d+/ - 注意:正则只在“没有更优前缀匹配”或“最长前缀不是 ^~ 类型”时才进入该阶段
普通前缀匹配和通用匹配是兜底主力
没有修饰符的 location /api/ 或 location / 属于普通前缀匹配,依赖“最长前缀”原则;而 location / 因为最短,通常作为最终 fallback。
-
location /api/ 和 location /api/v2/ 同时存在 → 请求
/api/v2/user会命中后者(更长) - location / 必须放在最后,否则会提前截断其他规则
- 它不参与正则跳过逻辑,仅当无精确、无 ^~、无正则匹配时才启用


















