proxy_pass 到底是“原样转发”还是“路径替换”?location 结尾那个不起眼的斜杠,究竟有什么魔力能让请求路径面目全非?
这篇文章,我们用最通俗的语言,带你理清 Nginx 代理转发中的这几个超级大坑。
一、proxy_pass 的两种核心模式
判断 Nginx 会怎么处理你的请求,标准其实非常简单粗暴:看看 proxy_pass 后面的地址,除了 IP 和端口号(host:port),有没有带上任何路径信息?
模式一:佛系“透传”模式(不带路径)
location /admin {
proxy_pass http://127.0.0.1:8082;
}
仔细看,proxy_pass 后面只有 http://127.0.0.1:8082,极其干净。这种情况下,Nginx 化身无情的转发机器:客户端发来什么完整的请求 URI,它就原封不动地发给后端,仅仅只是把域名/IP替换掉。如果你的请求是 /admin/upms/login,后端收到的也就是一模一样的 /admin/upms/login。
模式二:“偷天换日”的路径替换模式(带路径)
location /admin/ {
proxy_pass http://127.0.0.1:8082/form-server/;
}
一旦 proxy_pass 后面带了路径(哪怕只是一个微小的 /,比如 http://127.0.0.1:8082/),Nginx 就会开启“替换模式”。它的处理逻辑是:把请求 URI 中跟 location 字面量完全匹配的那部分硬生生抠掉,换成 proxy_pass 里写的路径,然后再把剩下的尾巴拼起来。
大坑预警: Nginx 可不懂你的业务逻辑!它就是个瞎子,照着 location 写的字符直接抠。抠完之后剩下什么,完全取决于你的斜杠怎么写。
二、致命的斜杠:一字之差,路径全毁
在替换模式下,location 结尾加不加斜杠,被 Nginx 抠掉的“余量”是完全不同的。我们来看一个真实的“翻车现场”:假设前端请求的是 /admin/upms/login。
| location 写法 | proxy_pass 写法 | Nginx 抠掉的部分 | 拼出来的最终路径(发给后端) | 结果点评 |
|---|---|---|---|---|
/admin (无斜杠) | .../form-server/ | /admin (不含结尾斜杠) | /form-server//upms/login | 灾难双斜杠! 余量带了前导斜杠,直接拼出了 //,部分后端框架会报错。 |
/admin/ (有斜杠) | .../form-server/ | /admin/ (含结尾斜杠) | /form-server/upms/login | 丢失 admin 路径! 斜杠对了,但原本的 admin 段永远消失了,后端直接 404。 |
/admin/ (有斜杠) | .../form-server/admin/ | /admin/ | /form-server/admin/upms/login | 完美! 被抠掉的 admin 在 proxy_pass 里补回去了,后端成功识别。 |
💡 划重点: 很多同学碰到的“前端改成路由报错变成 404”,就是踩了第二种情况的坑。Nginx 把
/admin/当作前缀吃掉了,如果后端代码还是需要这层路径,你必须要在proxy_pass的目标地址里手动写回去!
346



被折叠的 条评论
为什么被折叠?



