Nginx路径映射核心在于location匹配逻辑与proxy_pass斜杠行为的协同:location尾部斜杠决定匹配范围(/api/为目录匹配,/api为前缀匹配),proxy_pass末尾斜杠决定路径传递方式(带斜杠则剥离location前缀后转发,不带则原样拼接);正则或精确匹配时proxy_pass必须显式指定URI;静态资源需区分root与alias语义;响应重定向需配合proxy_redirect修正Location头。

路径映射不是“写对就能跑通”,而是要理解 Nginx 怎么看请求、怎么拆 URI、怎么拼路径。很多 404 和转发错位,根源不在后端或前端,就在 location 和 proxy_pass 的配合细节里。
location 匹配决定“谁来管这个请求”
匹配顺序直接影响路径处理逻辑,不能只看写了什么,得看它在配置里排第几:
-
= 精确匹配优先级最高,比如
location = /health只响应/health这个完整路径,不带斜杠也不行; -
^~ 最长前缀匹配,适合静态资源目录,如
location ^~ /static/,匹配成功就停止检查正则; -
~ 或 ~* 正则匹配按配置顺序执行,第一个命中即生效,
~* \.(js|css)$要放在通用前缀之后,否则可能被提前截断; - 普通前缀(无修饰符)按最长匹配,但若多个长度相同,取配置文件中先出现的那个。
proxy_pass 斜杠是路径转发的开关
末尾斜杠不是风格问题,是行为切换键:
-
proxy_pass http://svc/;→ 剥掉 location 匹配部分,只转发剩余路径,例如location /api/v2/+ 请求/api/v2/user→ 后端收到/user; -
proxy_pass http://svc;→ 原样追加整个请求 URI,/api/v2/user就变成http://svc/api/v2/user,后端必须能处理带前缀的路径; - 正则 location(
~或=)必须显式带 URI,比如proxy_pass http://svc/$1;或proxy_pass http://svc/health;,空写会报错。
静态资源映射:root 和 alias 别混用
二者语义完全不同,选错会导致路径多一层或少一层:
-
root /var/www;在location /assets/下,访问/assets/js/app.js对应物理路径是/var/www/assets/js/app.js; -
alias /var/www/public/;在同一 location 下,同样请求对应的是/var/www/public/js/app.js(/assets/被完全替换); - alias 后路径末尾建议带斜杠(
alias /var/www/public/;),避免因系统差异引发路径拼接歧义; - alias 不推荐和
try_files套用,某些 Nginx 版本存在兼容问题。
转发后还要管响应头,不然重定向就乱套
后端返回 302 或 301 时,Location 头常是绝对路径,不修正就会跳到错误地址:
-
proxy_redirect / /api/;把响应头中以/开头的 Location 改成/api/开头; - 如果后端返回完整 URL(如
Location: http://localhost:8080/login),可用proxy_redirect http://localhost:8080/ https://example.com/api/;; - 搭配
proxy_set_header Host $host;和X-Forwarded-For,确保后端日志和鉴权拿到真实上下文。


















