1. 背景说明

在使用 nginx 做反向代理时,proxy_pass 的路径拼接规则经常让人踩坑。比如:

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. 宝塔面板设置方法

步骤

  1. 打开宝塔面板 → 网站 → 你的网站 → 设置 → 反向代理
  2. 路径填写:/faq/
  3. 目标URL填写:http://127.0.0.1:3108/
  4. 保存并重载 nginx

这样,访问 http://你的域名/faq/api/chat,后端实际收到的是 /api/chat,接口就能正常响应了。

5. 常见问题与排查

  • 接口不存在?

检查后端实际监听的路径和 nginx 代理后的路径是否一致。

  • 路径没剥离?

检查 proxy_pass 是否以 / 结尾,location 是否以 / 结尾。

6. 总结

  • nginx 反向代理时,路径拼接规则非常重要,多一个斜杠,效果完全不同。
  • 推荐用 /faq/ + proxy_pass http://.../; 这种写法,最直观、最不容易出错。
  • 宝塔面板下,路径和目标URL都要以 / 结尾,才能实现前缀剥离。

建议收藏本篇,遇到接口404、路径错乱时,优先排查 nginx 路径拼接!

如有疑问,欢迎留言交流。