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

代理HTTP请求时如何正确传递请求头?解决Axios SSL证书错误

解决Axios代理请求头复制导致的SSL证书错误

问题根源

你遇到的ERR_TLS_CERT_ALTNAME_INVALID错误,本质是直接复制原始请求的Host头导致的:当你把原始请求的Host头(指向源站的Host)带到目标服务器(webhook.site)的请求里时,SSL证书验证会检查请求的Host是否和证书的备用名称匹配,而目标服务器的证书是给1inbox.biz的,自然和webhook.site不匹配,触发错误。

另外,除了Host头,还有一些请求头是不需要(也不应该)从原始请求直接传递的,比如Connection、Content-Length(Axios会自动计算)等。

正确实现方式

核心思路是:过滤掉不需要传递的请求头,只保留业务相关的头,同时让Axios自动处理目标服务器的Host头。

1. 定义需要过滤的请求头列表

先列出代理时不需要传递的头:

  • Host:由Axios根据目标URL自动生成
  • Connection:保持默认的keep-alive即可
  • Content-Length:Axios会根据请求体自动计算
  • Transfer-Encoding:Axios自动处理
  • Origin:如果不需要模拟源站,可直接过滤

2. 编写请求头过滤逻辑

// 原始请求头(假设来自上游请求,比如Express的req.headers)
const originalHeaders = originalRequest.headers;

// 需要过滤的请求头(统一转小写避免大小写问题)
const excludedHeaders = ['host', 'connection', 'content-length', 'transfer-encoding'];

// 生成过滤后的请求头
const filteredHeaders = Object.fromEntries(
  Object.entries(originalHeaders)
    .filter(([key]) => !excludedHeaders.includes(key.toLowerCase()))
);

3. 用过滤后的头发起请求

axios.post(remoteServerURL, originalRequest.body, {
  headers: filteredHeaders,
  // 注意:仅测试时可临时关闭证书验证,生产环境绝对禁用!
  // httpsAgent: new https.Agent({ rejectUnauthorized: false })
})
.then(response => {
  // 处理响应逻辑
})
.catch(error => {
  // 处理错误逻辑
});

4. 按需保留业务头

如果需要保留特定业务头(比如Authorization、User-Agent或自定义业务头),可以直接指定允许的头列表:

// 只保留指定的业务头
const allowedHeaders = ['authorization', 'user-agent', 'x-custom-business-header'];
const filteredHeaders = Object.fromEntries(
  Object.entries(originalHeaders)
    .filter(([key]) => allowedHeaders.includes(key.toLowerCase()))
);

关键注意点

  • 不要全盘复制请求头,HTTP协议中很多头和当前请求上下文绑定,代理时需重新生成。
  • 生产环境绝对不能关闭rejectUnauthorized,这会彻底失去SSL证书验证的安全保障。
  • 若需传递Origin头,要确保目标服务器允许该Origin的跨域请求,否则会触发CORS错误,但这和SSL证书错误是不同问题。

内容的提问来源于stack exchange,提问作者DomingoSL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 15:00:47