Nginx反向代理Apache访问子路径返回404 Not Found如何解决
问题根因
返回的404响应来自后端Apache服务,说明Nginx与后端服务的网络连通性正常,故障核心是反向代理路径转发规则和后端服务部署路径不匹配:
当前Nginx配置会把匹配到的请求路径完整透传给后端,也就是访问domain.com/something时,后端Apache实际收到的请求地址是http://xxx.xxx.xxx.xxx:8080/something。但你直接访问domain.com:8080能正常打开,说明后端服务实际部署在8080端口的根路径下,根目录下不存在/something对应的资源,因此返回404。
排查步骤
- 本地验证后端路径响应:在部署Nginx的服务器上执行
curl http://xxx.xxx.xxx.xxx:8080/something,如果同样返回题中的404报错,即可确认是请求路径转发错误,和Nginx服务本身无关。 - 检查proxy_pass配置格式:当前配置中
proxy_pass地址末尾未加斜杠,属于全路径透传模式,是触发路径转发错误的直接原因。 - 配置修改后先做语法校验:每次调整Nginx配置后,先执行
nginx -t确认无语法错误,再执行重载操作,避免引发服务中断。
解决方案
根据实际部署场景二选一即可:
场景1:需要将/something前缀的请求映射到后端根路径
即访问domain.com/something/xxx时,实际请求后端的/xxx资源,修改Nginx配置如下:
server { listen 80; location /something/ { proxy_pass http://xxx.xxx.xxx.xxx:8080/; # 补充反向代理通用请求头,避免后端无法获取真实客户端信息 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
注意:location路径末尾建议同步加斜杠,避免误匹配/somethingtest这类非预期路径
配置修改完成后执行systemctl reload nginx重载生效即可。
场景2:后端服务本身计划部署在/something路径下
无需调整Nginx转发规则,直接修改后端Apache的站点配置,为8080端口的服务新增/something路径的目录映射或站点别名,确保后端自身可以正常响应该路径的请求即可。
内容的提问来源于stack exchange,提问作者filran
相关产品推荐
相关产品推荐

