You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 17:39:54