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

如何在Puppeteer中设置区分大小写的请求Header?

Chrome 自动将请求头转为小写是 HTTP/2 协议的强制要求,该规范明确规定请求头字段名必须使用小写格式,这是浏览器内核层面的默认行为,和 Puppeteer 的 setExtraHTTPHeaders 方法无关。如果请求走 HTTP/1.1 协议,头信息的大小写会默认保留。

解决方法

方法1:禁用HTTP/2(最简便)

启动浏览器时添加 --disable-http2 参数强制所有请求走 HTTP/1.1 协议,即可保留你设置的请求头大小写格式,示例代码如下:

const browser = await puppeteer.launch({
  args: ['--disable-http2']
});
const page = await browser.newPage();
// 后续设置请求头的逻辑无需改动
await page.setExtraHTTPHeaders({
  "Accept-Language": "en-US;q=0.7",
});

方法2:通过CDP拦截请求修改(适配不能禁用HTTP/2的场景)

如果必须使用HTTP/2协议,可以调用Chrome DevTools Protocol的Fetch接口拦截请求,手动修改请求头的大小写:

const page = await browser.newPage();
// 启用Fetch拦截能力
await page.client().send('Fetch.enable', {
  patterns: [{ urlPattern: '*' }]
});

// 监听请求暂停事件,修改请求头
page.client().on('Fetch.requestPaused', async (event) => {
  const modifiedHeaders = event.request.headers.map(header => {
    // 匹配目标请求头,替换为你需要的大小写格式
    if (header.name.toLowerCase() === 'accept-language') {
      return { name: 'Accept-Language', value: 'en-US;q=0.7' }
    }
    return header
  })

  // 继续发起请求
  await page.client().send('Fetch.continueRequest', {
    requestId: event.requestId,
    headers: modifiedHeaders
  })
});

按照HTTP标准规范,请求头字段名本身是大小写不敏感的,正常服务端都能兼容处理不同大小写的头字段。只有当服务端实现不规范、严格匹配头名字符串时,才需要做上述特殊处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 04:36:00