用 Referrer-Policy 实现隐私一致的导航
通过实际 Referer 请求头理解同源、跨源、HTTPS 到 HTTP 降级与重定向。
BotBrowser Team
遇到路径意外泄露时,应检查实际请求,而不是笼统地问浏览器是否隐藏 referrer。现代默认 strict-origin-when-cross-origin 通常在同源时保留完整 URL,跨源 HTTPS 只保留来源,HTTPS 降级到 HTTP 时不发送 Referer。BotBrowser 可以重复已授权的配置和导航,但不能绕过浏览器策略或证明远端服务器如何保存数据。
要点
Referrer-Policy决定发送值,请求头历史名称是Referer。strict-origin-when-cross-origin区分同源、跨源和安全降级。- 每个重定向都是新请求,必须逐跳观察。
- 需要隐藏来源时使用
no-referrer,不要把秘密放进 URL。 - BotBrowser 重复声明的浏览器和配置条件,不保证服务器留存。
目录
策略与请求头
no-referrer 不发送值,same-origin 只向同源发送,origin 仅保留协议、主机和端口,strict-origin-when-cross-origin 只在同源保留完整 URL,跨源降为来源并抑制 HTTPS 到 HTTP。unsafe-url 可能暴露路径和查询,不适合敏感数据。Referer 是兼容性保留的历史拼写。
受控导航夹具
准备两个 HTTPS 来源和一个自有 HTTP 端点,使用合成 URL,记录每一跳的响应策略和请求头:
const seen = [];
page.on('request', request => {
if (request.url().includes('/referrer-observation'))
seen.push({ url: request.url(), referer: request.headers().referer ?? null });
});
await page.goto('https://source.example.test/start');
await page.getByRole('link', { name: 'cross-origin' }).click();
在现代策略下,预期同源为完整 URL、跨源 HTTPS 为 https://source.example.test/、HTTPS 到 HTTP 无 Referer。浏览器版本、请求模式和实际策略仍需一并记录。
来源、降级与重定向
来源由协议、主机和端口组成。仅改变路径仍是同源,改变任一元组成员就是跨源。“同站”不等于“同源”。重定向不会自动原样转发请求头;浏览器按每一跳的有效策略重新计算,跨源可减少路径,降级可清除来源。
证据决策矩阵
| 观察 | 稳妥解释 | 下一步 |
|---|---|---|
| 同源含完整路径 | 允许同源细节 | 仍应从 URL 移除秘密 |
| 跨源 HTTPS 仅含来源 | 降级生效 | 确认目标不需更多上下文 |
| HTTPS 到 HTTP 无头 | 降级受到保护 | 保持 HTTPS |
| 各跳不同 | 每跳独立计算 | 记录每个响应和请求 |
| 头意外缺失 | 策略或模式抑制 | 用最小夹具复测 |
Referer 不是身份证明,策略也不会删除已经写入的日志。BotBrowser 的主题能力是在声明的浏览器和配置中重复已授权导航并保留有限观察;限制是不能修改策略、读取其他来源日志或保证留存与合规结论。
结论
声明有效策略,用合成 URL 测试同源、跨源、HTTPS 到 HTTP 和重定向,检查真实 Referer,从 URL 移除秘密并坚持 HTTPS。只保留解释决策所需的最小证据。
常见问题
Referer 是拼写错误吗?
这是历史 HTTP 请求头名称;策略名称使用正确拼写 Referrer-Policy。
origin 会隐藏来源网站吗?
不会。它隐藏路径和查询,但可能发送协议、主机和端口。要隐藏来源本身请使用 no-referrer。
重定向能恢复完整 URL 吗?
不能。每个请求单独计算,后续响应不能追溯添加已省略的信息。
BotBrowser 会修改 Referer 吗?
它用于重复流程和测量;结果仍由浏览器策略、网络重定向和目标服务器决定。
延伸阅读
Public sources
示例使用的合成来源包括 https://source.example.test/`, https://source.example.test/start', https://old.example.test/account/overview`, https://new.example.test/home`, 以及 https://source.example.test/`、HTTPS.