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

本文涉及的产品
.cn 域名,1个 12个月
简介: 事件:公司的安卓app部分接口使用抓包工具时,如Charles。 返回400错误。后端使用nginx服务,php语言。分析问题:1、安卓不使用抓包工具,可以正常请求接口数据2、nginx同时对android、ios提供服务,ios正常3、安卓只有使用代理工具,才会出现400有此可见, 问题出在代理工具上。

事件:

公司的安卓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”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。
目录
相关文章
|
3天前
|
缓存 应用服务中间件 Apache
HTTP 范围Range请求
HTTP范围请求是一种强大的技术,允许客户端请求资源的部分内容,提高了传输效率和用户体验。通过正确配置服务器和实现范围请求,可以在视频流、断点续传下载等场景中发挥重要作用。希望本文提供的详细介绍和示例代码能帮助您更好地理解和应用这一技术。
37 19
|
29天前
|
JSON Java 数据格式
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
84 25
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
|
11天前
|
JSON JavaScript 前端开发
什么是HTTP POST请求?初学者指南与示范
HTTP POST请求是一种常用的HTTP方法,主要用于向服务器发送数据。通过合理设置请求头和请求主体,可以实现数据的可靠传输。无论是在客户端使用JavaScript,还是在服务器端使用Node.js,理解和掌握POST请求的工作原理和应用场景,对于Web开发至关重要。
128 18
|
8天前
|
应用服务中间件 Linux 网络安全
nginx安装部署ssl证书,同时支持http与https方式访问
为了使HTTP服务支持HTTPS访问,需生成并安装SSL证书,并确保Nginx支持SSL模块。首先,在`/usr/local/nginx`目录下生成RSA密钥、证书申请文件及自签名证书。接着,确认Nginx已安装SSL模块,若未安装则重新编译Nginx加入该模块。最后,编辑`nginx.conf`配置文件,启用并配置HTTPS服务器部分,指定证书路径和监听端口(如20000),保存后重启Nginx完成部署。
177 7
|
10天前
|
JSON 数据格式
.net HTTP请求类封装
`HttpRequestHelper` 是一个用于简化 HTTP 请求的辅助类,支持发送 GET 和 POST 请求。它使用 `HttpClient` 发起请求,并通过 `Newtonsoft.Json` 处理 JSON 数据。示例展示了如何使用该类发送请求并处理响应。注意事项包括:简单的错误处理、需安装 `Newtonsoft.Json` 依赖,以及建议重用 `HttpClient` 实例以优化性能。
54 2
|
28天前
|
Web App开发 大数据 应用服务中间件
什么是 HTTP Range请求(范围请求)
HTTP Range 请求是一种非常有用的 HTTP 功能,允许客户端请求资源的特定部分,从而提高传输效率和用户体验。通过合理使用 Range 请求,可以实现断点续传、视频流播放和按需加载等功能。了解并掌握 HTTP Range 请求的工作原理和应用场景,对开发高效的网络应用至关重要。
65 15
|
1月前
|
数据采集 JSON 测试技术
Grequests,非常 Nice 的 Python 异步 HTTP 请求神器
在Python开发中,处理HTTP请求至关重要。`grequests`库基于`requests`,支持异步请求,通过`gevent`实现并发,提高性能。本文介绍了`grequests`的安装、基本与高级功能,如GET/POST请求、并发控制等,并探讨其在实际项目中的应用。
43 3
|
28天前
|
Web App开发 网络安全 数据安全/隐私保护
Lua中实现HTTP请求的User-Agent自定义
Lua中实现HTTP请求的User-Agent自定义
|
2月前
|
缓存 应用服务中间件 网络安全
Nginx中配置HTTP2协议的方法
Nginx中配置HTTP2协议的方法
130 7
|
3月前
|
应用服务中间件 BI nginx
Nginx的location配置详解
【10月更文挑战第16天】Nginx的location配置详解