使用Axios搭配TinyProxy时遭遇HTTPS重定向过多(ERR_FR_TOO_MANY_REDIRECTS)错误
看起来你遇到的问题核心是Axios通过HTTP代理请求HTTPS站点时,请求格式出现了错误,导致TinyProxy处理时生成了无效的URL,进而引发了无限重定向循环。我来帮你拆解下问题和解决方案:
问题根源分析
从你提供的TinyProxy日志里,有一行关键信息直接暴露了问题:
INFO Feb 23 20:23:25.318 [4621]: process_request: trans Host GET http://whatismyipaddress.com:80https://whatismyipaddress.com/ for 6
可以看到,TinyProxy收到的请求被错误拼接成了http://whatismyipaddress.com:80https://whatismyipaddress.com/——这是把HTTP代理的目标地址和HTTPS请求的URL直接硬拼在了一起。这种无效URL会触发目标站点的重定向,而重定向后的请求又会被同样错误处理,最终形成循环,抛出ERR_FR_TOO_MANY_REDIRECTS错误。
这种情况通常是因为Axios默认的代理配置在处理“HTTP代理+HTTPS请求”的组合时,没有正确使用CONNECT隧道方式通信,而是把HTTPS请求当成普通HTTP请求转发给TinyProxy,才导致了URL拼接的混乱。
已验证的有效解决方案
你发现用http.Agent手动配置代理后能正常工作,这个思路完全正确。因为手动指定Agent可以强制Axios以正确的方式通过代理建立连接:对于HTTPS请求,会先通过代理发送CONNECT请求建立加密隧道,再传输HTTPS流量,从根本上避免了URL拼接错误。
如果需要同时支持HTTP和HTTPS请求的代理,可以扩展这个方案,分别配置对应的Agent:
import axios from "axios"; import http from "http"; import https from "https"; // 配置HTTP请求的代理Agent const httpAgent = new http.Agent({ host: "你的代理服务器IP", port: 你的代理端口, protocol: "http:", }); // 配置HTTPS请求的代理Agent const httpsAgent = new https.Agent({ host: "你的代理服务器IP", port: 你的代理端口, protocol: "http:", }); // 创建带全局代理配置的Axios实例 const proxyAxios = axios.create({ httpAgent, httpsAgent }); // 测试HTTPS请求 proxyAxios.get("https://whatismyipaddress.com") .then(response => console.log(response.data)) .catch(error => console.error("错误:", error)); // 测试HTTP请求 proxyAxios.get("http://api.com") .then(response => console.log(response.data)) .catch(error => console.error("错误:", error));
额外说明
你的TinyProxy配置(DisableViaHeader Yes和Allow 0.0.0.0/0)是没问题的,不需要调整。问题完全出在Axios默认代理配置对HTTP/HTTPS交叉场景的处理逻辑上,手动指定Agent是目前最直接可靠的解决方式。
备注:内容来源于stack exchange,提问作者UsAA12

