http请求使用代理,nginx 400 bad request


事件:

    公司的安卓app部分接口使用抓包工具时,如Charles。 返回400错误。

    后端使用nginx服务,php语言。


分析问题:

    1、安卓不使用抓包工具,可以正常请求接口数据

    2、nginx同时对android、ios提供服务,ios正常

    3、安卓只有使用代理工具,才会出现400


有此可见, 问题出在代理工具上。 为什么ios使用同一个代理工具没有问题?

百度、google说  由于语法格式有误,服务器无法理解此请求。不作修改,客户程序就无法重复此请求。 

又有文章说,http cookie值太大,http头部信息错误等

然后按照网上的方法修改了请求数据和nginx缓存配置,nginx依旧无情的返回400,网上的解决方案基本上都试过了,依旧没有解决问题。
将接口的Url放在firefox里访问,可以正常请求。那会不会是代理工具做转发时修改了http请求的信息?


web代理工具的原理:

一般的代理工具是将本地客户端的请求先发送给代理,然后由代理向服务器发送请求,代理接收到服务器回复后,将其再转发给客户端。

这么来看,很有可能是代理工具在做http转发时,修改了请求信息。

api的访问方式是:http://api.hunchelaila.com?uid=1&client_type=android&method=app.passport.user&v=1

代理工具拿到客户端的请求后,会做url拆分:

    host : api.domain.com

    path : 

    params

        uid : 1

        client_type : android

        method : app.passport.user

        v : 1
拆分后,观察到path对应的是 空, 也就是说此url没有文件路径,但是这个Url在firefox可以访问。

然后又拿这个链接放在firefox里, 发现firefox自动把地址改成了:http://api.hunchelaila.com/?uid=1&client_type=android&method=app.passport.user&v=1  , 在域名后,?问号前加了 / 

然后修改了代理工具中path的值  path : /

执行下 repeat 重发一次请求, 返回200, 发送成功。


问题原因:

android请求时,域名后面没有跟上目录部分,所以代理工具解析时 path是空, 转发请求时, 当时也是空。

浏览器能自动在域名后面补充 / ,所以使用浏览器访问没有问题。       

这问题  挺坑爹的。。。。


以下面这个URL为例,介绍下普通URL的各部分组成 

http://www.zhanglirong.cn:8080/news/index.php?boardID=5&ID=24618&page=1#name 

    1.协议部分:该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等本例中使用的是HTTP协议。在"HTTP"后面的“//”为分隔符

    2.域名部分:该URL的域名部分为“www.hunchelaila.com”。一个URL中,也可以使用IP地址作为域名使用

    3.端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口

    4.虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例中的虚拟目录是“/news/”

    5.文件名部分:从域名后的最后一个“/”开始到“?” 为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“ /”开始到结束,都是文件名部分。本例中的文件名是“index.php”。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名

    6.锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分

    7.参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“boardID=5&ID=24618&page=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。

上一篇 下一篇


评论



分享

最新加入

最新评论

你知道我是谁: 交友网站上的骗子,打着谈恋爱的旗号,干着骗炮的事情! 查看原文 04月08日 10:30
admin: 编程语言和web服务器如nginx,都可自定义状态码。阿里产品的问题请咨询阿里云的客服,提个工单就可以。 查看原文 12月13日 20:26
a_a_a: 自定义状态码怎么实现? 比如 阿里高防拦截 返回码 560 等等,在线等 急 查看原文 12月13日 16:56
admin: 查看原文 12月11日 22:08