使用Axios请求挂起但curl请求成功,原因是什么?
Axios请求挂起/异常返回的原因分析
核心差异:HTTP代理访问HTTPS目标的处理逻辑
通过HTTP代理访问HTTPS站点时,客户端必须先向代理发送CONNECT请求,建立加密隧道后再传输HTTPS流量。curl会自动完成这一流程,但Axios的默认配置在处理该逻辑时存在兼容性问题,导致连接挂起或仅返回代理的“Connection Established”响应(未继续转发目标站点的HTTPS数据)。
具体可能的原因:
- 代理协议适配问题:Axios配置的
proxy.protocol: "http",其默认请求适配器(如Node.js的http模块)未正确处理HTTPS目标通过HTTP代理的隧道建立流程,导致连接卡在隧道协商阶段。 - 长连接复用冲突:Axios默认启用Keep-Alive,但代理服务器对长连接的处理逻辑与curl不同,导致连接无法正确复用,出现挂起或异常终止。
- 请求头不一致:Axios自动生成的
CONNECT请求头(如Host格式、额外字段)与curl发送的存在差异,代理服务器无法正确识别并完成隧道建立,仅返回连接确认后就中断了后续流量转发。
可行的解决方向:
- 调整代理协议配置:若代理支持HTTPS,将
proxy.protocol改为https;若仅支持HTTP,可手动配置适配器的隧道建立逻辑。 - 禁用Keep-Alive:在Axios配置中添加以下代码,避免长连接冲突:
const http = require('http'); const https = require('https'); let response = await axios("https://api.my-ip.io/ip", { proxy: { host: "127.0.0.1", port: 8118, protocol: "http" }, httpAgent: new http.Agent({ keepAlive: false }), httpsAgent: new https.Agent({ keepAlive: false }) }); - 对齐请求头:手动设置与curl一致的
Host头,确保代理能正确处理隧道请求:let response = await axios("https://api.my-ip.io/ip", { proxy: { host: "127.0.0.1", port: 8118, protocol: "http" }, headers: { 'Host': 'api.my-ip.io' } });
内容的提问来源于stack exchange,提问作者JohnWick
相关产品推荐
相关产品推荐

