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.zhanglirong.cn?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.zhanglirong.cn/?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”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
小视频程序开发掌握技巧才最重要
为了节省储存空间,大部分视频文件在进行播放之前都会经过压缩。相反,在播放的过程中就需要进行一个反射的解压缩过程,最早这项工作是由CPU完成的,像一些普通分辨率的AVI、Rmvb等文件,绝大多数CPU都可以胜任,但是发展到现在人们开始偏向于1080p超清视频需求之后,数据解压缩的工作量翻倍增长。再加上技术不断发展,在小视频程序开发过程中,经常会遇到关于硬编解和软编解之间的选择问题。至于如何选择,根据情况才能做出选择。1.推流编码推荐Android4.3或以上使用硬件编码,以下使用软件编码,ios使用全硬件编码方案。2.播放解码Android和ios播放器大都使用软件解码方案,虽然在一定程度上牺牲功耗,但是在细节方面表现还是不错的。3.软编码和硬编码的作用软解码:使用CPU进行编码硬编码:使用非CPU进行编码4.软编码和硬编码的比较软编码:实现直接、简单和参数调整方便,但CPU负载较重,性能比起硬编码来说较低,软编码可以在运行时确定,低码率下的质量会比硬编码的质量要好一些。硬编码:性能好,在低码率下质量低于软编码器,而硬编码是不能够改变的,但是部分产品在GPU硬件平台上移植了优秀的软编算法...
- 下一篇
Swift中关于集合计算的几种函数记录(intersect、symmetricDifference、union、subtract)
Swift中关于集合计算的几种函数记录(intersect、symmetricDifference、union、subtract) 很久之前用过一次,后来就忘了。。。扎心,现在记录一下 PS:这几种函数其实不限于swift内的,在JavaScript、python、DB等其他语言,应该也有类似用法,这里我只简单讲了在swift内的用法。 一、概念介绍 intersection(_ :) 创建一个只包含两个公共值的新集合。(交集) symmetricDifference(_ :) 创建一个新集合,其值集在两个集合中,但不能同时存在。(非交集) union(_ :) 创建一个包含两个集合中的所有值的新集合。(合集) subtracting(_ :) 创建一个值不在指定集中的新集。(补集) 二、举个例子 我们新建一个playground(方便测试) let list1:Set = ["1","2","3"] let list2:Set = ["2","3","4"] //list1和list2都有的 print(list1.intersection(list2)) //既不在lis...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Hadoop3单机部署,实现最简伪集群
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果