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

含丹麦语重音字符的URL请求报HTTP头无效字符错误求助

解决包含丹麦语重音字符的URL请求时的头字符无效错误

看起来你遇到的问题核心是带丹麦语重音(如æ、ø、å)的URL在请求时,Host头包含了Node.js HTTP模块不允许的非ASCII字符,直接转整个URL或者只处理部分内容的方式没到位,才导致了_http_outgoing.js:494的TypeError。我给你几个针对性的解决方案:

1. 拆分URL,分别编码Hostname和Path

直接对整个URL转ASCII是行不通的,因为URL的不同部分需要不同的编码规则:

  • Hostname(域名部分)需要用**IDNA编码(punycode)**转成ASCII格式
  • Path(路径部分)需要用encodeURIComponent编码非ASCII字符

试试修改你的函数为这样:

const { URL } = require('url');
const punycode = require('punycode');

function getBody(rawUrl) {
  // 补全协议头(如果没有的话)
  const urlWithProtocol = rawUrl.startsWith('http') ? rawUrl : `http://${rawUrl}`;
  
  // 解析URL为各个组件
  const parsedUrl = new URL(urlWithProtocol);
  
  // 把包含重音的域名转成punycode(ASCII格式)
  parsedUrl.hostname = punycode.toASCII(parsedUrl.hostname);
  
  // 正确编码路径中的非ASCII字符,注意保留斜杠
  parsedUrl.pathname = parsedUrl.pathname.split('/').map(segment => 
    encodeURIComponent(segment)
  ).join('/');
  
  // 用处理后的完整URL发起请求
  return instance.get(parsedUrl.toString(), {
    headers: {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36',
      // GET请求不需要Content-Type(没有请求体),换成Accept更合理
      'Accept': 'text/plain; charset=UTF-8'
    }
  });
}

2. 调整请求头,去掉不必要的Content-Type

你设置的Content-Type: text/plain; charset=UTF-8在GET请求里是多余的——GET请求没有请求体,这个头是用来描述请求体的格式的。换成Accept头更合适,告诉服务器你希望接收UTF-8编码的文本响应,避免头信息混乱。

3. 确认Node.js版本

旧版本的Node.js(比如v10及以前)对IDNA编码的支持有缺陷,可能导致punycode转换不彻底。建议升级到v12+的LTS版本,确保URL模块和punycode处理的正确性。

为什么之前的转换没用?大概率是你没有拆分URL的不同部分分别处理,直接转整个URL会导致路径部分的编码错误,或者域名的punycode转换没生效。拆分后分别处理就能解决Host头的无效字符问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:49:40