记录一次前端调用后端接口返回404的经历

14,499 阅读2分钟

问题描述

接口是新开发的,并没有上线,所以我在测试环境中带上了后端项目的分支
在测试环境调用后端接口时却发现404报错,如图:

思考过程

  • 首先第一反应是url写错了,比如单词写错,多了"/"等,但是重新去接口文档中复制发现并没有错。
  • 接着我怀疑是没有后端接口资源,我直接把接口在浏览器中打开,发现GET请求是可用的。而且经过询问,该接口已经经过了ios和安卓的验证是可行的。我自己用postman请求了一下发现确实可以通 (没填参数,但是是有后端资源的)。

  • 然后我怀疑浏览器里的POST被代理到别的的环境中去了,关Charles关switchyOmega,检查我负责的项目中有没有被中间件代理,然鹅并没有。这就有意思了,我顿时觉得我可能会从这个问题里学到东西。
  • 仔细看404的返回值是这样的:

openresty是一个基于Nginx 与Lua 的高性能Web 平台,也就是说这个404是Nginx返回的,于是让后端同学查了一下Nginx日志,比较了一下正常的post接口请求和这个有什么区别。结果发现并没有什么不一样。经过后端同学的更进一步探索,发现请求是由两层Nginx代理的,最后居然会把请求的origin从测试域名修改成线上域名???也就是前端自己调本域名的接口居然跨域了,直接被Nginx拦下来,且没有跨域报错信息。get请求没有origin,所以正常,post带了origin所以才出错了。其他正常的接口是因为后端做了针对性配置,这个新接口没配,果断让后端去改。这种历史遗留下来的坑真的是防不胜防……

结论

404不一定是纯前端问题,当前端无出错可能时,把目光放到前端以外的范畴,可能会有新答案。