每周一坑-nginx反向代理接口403 这个问题很坑(老实说我很少把话说那么满,一般只会说“比较”、“有点”),从问题出现(8月12日),掺杂了我、前端开发、我经理一起排查,终于在上周五(8月19日)解决。 话说我们以前有个域名叫: abc.cn,nginx里面有个配置进行反向代理转发接口的,对于 https://www.abc.cn/data/xxx.js 应该转发到(proxy_pass) 到 另一个域名: 。 其中,前面add_header 是用于开放跨域请求的,因为浏览器为了安全问题一般都限制了跨域访问。 这个配置我记得是开发上去服务器自己加的,以前都是好的(就是因为以前配置是好的,所以后面我一直坚信nginx配置是没问题的,但实际上我错了)。但从8月12日开始就调不通,反馈变成了404页面,当时第一个坑事是:被调接口的域名 返回502(人家的网站死了,确实不关我们事),然后运营的人说先屏蔽不要让业主方发现(撇清关系) 过了几天,这个负责 的人找我们一起联调接口,毕竟业主方觉得这个功能需要保留。 第二个坑事:那一批 的服务器(都在天翼云上),很奇怪地,在服务器内部 curl 人家的接口不通,但在其他服务器上没问题。想不到到我现在写博客这一刻都还是不通= =。首先我已经排除过,iptables、nginx配置没加人家黑名单,跟电信WAF也确认过,他们也没有。 再来看看一个正常的服务器(没被人拉黑的),curl这个接口应该是有返回的,所以我们后来换新服务器,域名为:ABC.cn 幸好我没在这个被他们拉黑的域名做过多的尝试,找来了另一个机器去测~~~ 第三个坑事:一开始这个js调不通的时候,不知道是我们经理还是接口对接人,叫前端从js接口改做xml的接口转发,然后我配置之后返回404。404一直解决不了后,我经理还特意开发一个定时请求人家接口的jar包程序,好像是每5分钟请求一次的。。。(既然浏览器不行,那就直接通过能请求他们接口的服务器公网ip+端口形式去请求) 现在变成:https://www.ABC.cn/data/xxx.xml 需要转到别人的: 大致是这样的,跑这个jar包的时候还不一定每次都能成功,但只要跑成功一次就可以放任不管(这个我也听得比较懵逼)。听说是人家这个接口做的不好,每5分钟内能保证请求成功一次,要恰到好处拿到他们这个点 = = 这个点就是你刷浏览器刚好刷到数据,代表jar包也能同理启动起来,没有报错。 第四个坑事:不知道什么原因,突然又说从xml改回到js接口转发。此时nginx报错:HTTP ERROR 403,这个问题跟nginx配置 proxy_set_header 有关,解决参考:【https://blog.csdn.net/u013887008/article/details/119976269】 这个东西我还没仔细研究过,先记录下。大致意思是,用来重写请求头中host字段,不然会导致请求失败。 详情可以参考这个:https://www.cnblogs.com/goloving/p/13663843.html proxy_set_header Host $http_host; 要改成: proxy_set_header Host $proxy_host; (上面 rewrite 重定向和 proxy_pass 到百度被注释是用来做测试的,因为一直请求不到需要的接口,经理叫我试试重定向能不能生效,生效再研究反向代理) 没搞清楚的是,为啥以前那个域名(abc.cn)这样配置(proxy_set_header Host)没问题,而现在在新域名上会用不了?? 第五个坑事,这是最后一个,从abc.cn(curl不通接口) 换域名为ABC.cn(通接口),我当时不想给ABC.cn 配置ssl 证书,因为阿里的免费整数用一个少一个 = =,想着省一点用。然而用 说调不通,好像说跨域,所以大家看我上面截图,location外面配了个 add_header 解决跨域问题的,如果用http去调人家接口是不通的,所以最后只能申请回ssl证书。 (责任编辑:) |