0 前言

这两天弄网站后端服务,需要使用nginx反向代理。我将后端服务放在了二级目录/api/,本地测试一切正常,部署到服务器却始终返回404页面。查了很多博客,问了好几种AI,都没有解决这个问题。今天上午终于找到了问题所在,在此记录一下。

1 反向代理

  • 基本设置:使用nginx反向代理/api/时,一般代码设置成如下即可
location ^~ /api/ {
	proxy_pass http://localhost:8000/;
	proxy_set_header Host localhost;
}

基本每个AI都能够给出类似或者更加复杂合理的代码。这段代码的含义是监听地址下的/api/xxx转发到http://localhost:8000/xxx。需要注意每一个/都不可以省略;第二行代码Host后面的部分与proxy_pass中地址一致即可。

  • 宝塔面板:提供了可视化设置选项,点击【网站】-【设置】-【反向代理】便可找到。勾选高级功能,设置根目录为/api/,目标网址为http://localhost:8000,发送地址为localhost即可

2 问题所在

  • 正常来说,按照上面的设置,反向代理就已经成功了。但倘若在宝塔面板中启用了伪静态设置,对于typecho来说是下面这个样子
if (!-e $request_filename) {
    rewrite ^(.*)$ /index.php$1 last;
}
  • 那么你就会发现,无论你怎么设置二级目录的反向代理,都无法正常访问,只会返回404
  • 可能的原因:rewrite部分没有支持二级目录,但我不懂PHP,不会修改;有能力的人可以自行尝试

3 解决问题

  • 关闭宝塔面板提供的伪静态设置,即删除第2节中的那段代码即可
  • 但伪静态设置对网站的SEO等方面具有很重要的价值,一种替代方案为在配置文件root index.php xxx下面添加下面这一行代码
try_files $uri $uri/ /index.php?$args;

后记

这个问题,花费了我将近十个小时,服务器都重装了两次。网上找了很久都没有找到真正说到这个问题的点。倒是提到了很多其他可能引起这个问题的原因:1)nginx配置错误,主要是/的问题;2)后端服务未启动。