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

