现在项目要上kong网关,然后再使用的时候,出现了一个让人摸不到头绪的bug,特记录一下。
项目A,项目B,通过kong做一个请求的转发。出现的bug:
kong的域名暂定www.baidu.com ,项目A的域名暂定www.A.com 项目B的域名暂定www.B.com 。使用网关后,项目A的域名变成了www.baidu.com/A/ ,项目B的域名变成了www.baidu.com/B/ 。现在在www.baidu.com/B/ 下做post请求,一切ok,在www.baidu.com/A/ 下做post请求,所有的请求都变成了get请求。
经过验证,www.A.com下的post是可以正常的。(说的有点绕,总体就是项目A用网关后,post请求都变成get请求了)
思考思路:1.先去验证了A项目自己之前用的那个域名,post正常
2.思考是不是项目A部署服务器的nginx有问题。
3.好像kong做了转发后,丢失了method.(现在这个问题别人解决去了,等过两天把过程分享上来)
kong这边没有解决,我自己处理了。
因为测服监听了80的端口,我就去阿里上,把80端口关闭了,这样,就不转发到80了,这个问题就暂时处理完了。
(这个问题,我一层层追进去,发现,前端的https请求,经过网关到我这里,就变成http了。我要是在nginx的配置文件里加上http转https的,ios就可以正常响应了,post就是post。我要是把转发关掉,那请求到我这,就是http的请求,get也变成post了也。kong那里不知道怎么处理,就只有我自己来。既然到我这里,http请求有问题,那就只能把http的请求关了,让kong只能转发到https上。我的nginx用307把http转到https的。安卓请求时,报错307,他们的框架还不让有307,不然就给你报错!然后我就直接把80监听http的直接关了,只留下监听https的,问题就忽然解决了。然后问题追踪到这里,我就没有往下处理了)
再解释一下上边的意思,网关配置的请求转发,https的post,到了我这里(此刻的nginx没有做http转https),就变成了http的get。我在nginx做了http转https的话,那网关的https的post请求,到了我这里,还是https的post。(莫名其妙!)
后来发现一个新的问题,用了kong后,我的项目本来用的flask框架,可以拿到用户的访问ip,然后记录。但是用了kong后,拿到的ip就成了内网ip了,因为所有请求都是kong这里发过来的。
解决方法,改flask的源码。总之是一步一步的往里边找,追到源头,其实就是flask自己去请求头里拿一个参数的ip(X-Forwarded-For),通过打印所有的请求头,可以看到,‘X-Real-Ip’这个请求头里的字段,是包含了正确的ip的,故改动如下:
文件是~/.pyenv/versions/3.5.5/envs/env/lib/python3.5/site-packages/flask_security/utils.py文件里的65行到66行,下边是源文件:
这是改过后的(就是把login_user方法里,截取用户ip的方法换了一下,因为用到了网关,所以拿到的用户的ip就变了,现在需要换成从下边这个请求头里拿用户的ip)
文章评论
发布于 2019-09-02 21:02:40 回复
发布于 2019-09-06 14:44:41 回复
发布于 2019-09-06 14:52:26 回复
发布于 2019-09-06 15:40:14 回复