生产环境配置Nginx反向代理后,Axios请求Express后端返回HTML而非JSON
故障核心原因排查
你当前遇到的请求被返回前端HTML、而非后端业务数据的问题,是3个Nginx配置错误叠加导致的:
- 代理协议不匹配:
/order/getTimeSlots对应的配置里,proxy_pass写的是https://localhost:8080,但你本地验证后端服务是通过curl http://localhost:8080/getTimeSlots正常返回结果的,说明8080端口运行的是HTTP服务,而非HTTPS。协议不匹配会直接导致Nginx和后端的代理连接失败,请求最终fallback到location /的规则,返回前端的index.html。 - 代理路径拼接错误:按照你当前的proxy_pass写法(不带尾随斜杠),Nginx会把前端发起的完整请求路径
/order/getTimeSlots原样拼到后端地址后,最终转发到后端的路径为http://localhost:8080/order/getTimeSlots,和你本地验证的后端实际路由/getTimeSlots完全不匹配,即使代理连接成功,也会因为后端路由不存在无法返回正确数据。 - 规则覆盖性不足:单独针对单个接口写location规则,会导致同前缀的其他后端接口依然会命中静态资源的fallback规则,长期维护成本极高。
修正方案
调整Nginx配置,统一代理所有/order前缀的后端请求,修正协议和路径规则:
- 将代理协议统一为HTTP,和后端实际运行的服务对齐
- 给location规则加
^~匹配前缀,确保这类接口请求优先级高于静态资源的fallback规则,不会被拦截返回HTML - 通过proxy_pass的尾随斜杠实现路径重写,自动去掉请求的
/order前缀,和后端实际路由路径对齐
修正后的完整配置示例:
server { listen 80 default_server; listen [::]:80 default_server; root /var/www/mywebsite.com; index index.html index.htm; server_name mywebsite.com www.mywebsite.com; # 保留单页应用静态资源的fallback规则 location / { try_files $uri /index.html; } # 统一处理所有/order前缀的后端接口请求 location ^~ /order/ { # 末尾带斜杠,Nginx会自动替换匹配的/order/前缀 # 前端请求 /order/getTimeSlots 会被转发为 http://localhost:8080/getTimeSlots proxy_pass http://localhost:8080/; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_cache_bypass $http_upgrade; } # 保留原有ordersubmit的代理规则 location ^~ /ordersubmit { proxy_pass http://localhost:8080; proxy_http_version 1.1; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }
配置生效验证步骤
- 先执行
nginx -t检查配置语法,确认无报错后执行nginx -s reload重载配置 - 直接访问
mywebsite.com/order/getTimeSlots,确认返回的是后端的业务数据,而非前端HTML页面 - 对比本地curl后端返回的结果,确认数据格式、内容完全一致
内容的提问来源于stack exchange,提问作者emil
相关产品推荐
相关产品推荐

