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

Puppeteer设置referer请求头被截断是否为预期行为及解决方案咨询

问题原因

该现象不属于Puppeteer的预期行为,本质是Chromium内核的默认Referrer-Policy规则导致的。默认配置下,跨域请求的Referer只会返回协议+域名+端口的源站部分,路径、查询参数等内容会被自动裁剪,只有同域请求才会携带完整的Referer路径,这是浏览器为了降低敏感信息泄露风险的默认安全策略。

可行解决方案

有两种常用的workaround可以实现跨域请求携带完整Referer:

  • 方案一:仅页面主请求需要自定义Referer时,直接在page.goto参数中传入referer字段,该配置优先级高于默认Referrer-Policy限制,不会被裁剪:
var page, browser

browser = await puppeteer.launch();
page = await browser.newPage();
await page.goto('https://bloodcurdling-alien-85469.herokuapp.com/http-tools', {
  referer: 'https://cor.goo.com/ffffff/ssss/wwwwwwww'
})
await page.screenshot({ path: 'snap.png' });
await browser.close();
  • 方案二:如果需要页面内所有请求(包含静态资源、AJAX接口等)都携带自定义完整Referer,开启请求拦截手动覆盖Referer头即可:
var page, browser

browser = await puppeteer.launch();
page = await browser.newPage();
await page.setRequestInterception(true);
page.on('request', req => {
  const headers = req.headers();
  headers['referer'] = 'https://cor.goo.com/ffffff/ssss/wwwwwwww';
  req.continue({ headers });
});
await page.goto('https://bloodcurdling-alien-85469.herokuapp.com/http-tools')
await page.screenshot({ path: 'snap.png' });
await browser.close();
相关逻辑实现位置

Puppeteer本身没有对Referer头做任何特殊裁剪处理,你看到的裁剪逻辑完全在Chromium内核中实现:
核心逻辑位于Chromium源码的//services/network/public/cpp/resource_request_info.cc中Referrer的计算模块,以及//third_party/blink/renderer/core/loader/resource_fetcher.cc中请求发起前的头处理逻辑。Puppeteer仅负责通过CDP接口向Chromium传递配置参数,不会修改请求头内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:27:00