如何在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
相关产品推荐
相关产品推荐

