1. 背景说明
在使用 nginx 做反向代理时,proxy_pass 的路径拼接规则经常让人踩坑。比如:
- 你希望访问 http://host/faq/api/chat 实际代理到后端 http://127.0.0.1:3108/api/chat
- 但后端却收到 /faq/api/chat,导致报“接口不存在”
2. 关键原理:proxy_pass 路径拼接规则
2.1 配置示例
location ^~ /faq {
proxy_pass http://127.0.0.1:3108;
}
- 这种写法,nginx 会把原始路径 /faq/api/chat 原样传给后端,即后端收到 /faq/api/chat。
2.2 你想要的效果
你希望后端收到 /api/chat,而不是 /faq/api/chat。
3. 解决方法
方法一:去掉前缀(推荐)
让 nginx 自动去掉 /faq 前缀,只把后面的路径转发给后端。
配置方法
location ^~ /faq/ {
proxy_pass http://127.0.0.1:3108/;
}
- 注意:location 和 proxy_pass 都以 /faq/ 和 / 结尾
- 这样,访问 /faq/api/chat 时,nginx 会把请求转发为 /api/chat 给后端
详细说明
- proxy_pass 结尾有 /,nginx 会用 location 后的部分替换掉 location 匹配的前缀
- 例:/faq/api/chat → /api/chat
方法二:后端支持带前缀
如果你希望后端直接处理 /faq/api/chat,那后端服务必须有 /faq/api/chat 这个接口。
- 这种方式一般不推荐,除非你有多租户或多前缀需求
4. 宝塔面板设置方法
步骤
- 打开宝塔面板 → 网站 → 你的网站 → 设置 → 反向代理
- 路径填写:/faq/
- 目标URL填写:http://127.0.0.1:3108/
- 保存并重载 nginx
这样,访问 http://你的域名/faq/api/chat,后端实际收到的是 /api/chat,接口就能正常响应了。
5. 常见问题与排查
- 接口不存在?
检查后端实际监听的路径和 nginx 代理后的路径是否一致。
- 路径没剥离?
检查 proxy_pass 是否以 / 结尾,location 是否以 / 结尾。
6. 总结
- nginx 反向代理时,路径拼接规则非常重要,多一个斜杠,效果完全不同。
- 推荐用 /faq/ + proxy_pass http://.../; 这种写法,最直观、最不容易出错。
- 宝塔面板下,路径和目标URL都要以 / 结尾,才能实现前缀剥离。
建议收藏本篇,遇到接口404、路径错乱时,优先排查 nginx 路径拼接!
如有疑问,欢迎留言交流。