Referrer-Policy
Referrer-Policy 控制浏览器在跳转或请求资源时携带多少 Referer 信息,兼顾统计分析和隐私安全。
#type / concept
#status / evergreen
#tech / security
#resource / http
#platform / browser
[!info] related notes
- 所属 MOC: security-moc
- 总览: http-response-headers
- 并列安全头: CSP, HSTS, x-content-type-options, x-frame-options, permissions-policy
Referrer-Policy
一句话定义
Referrer-Policy 控制浏览器在跳转或请求资源时,携带多少来源页面的 URL 信息(Referer)。
它要解决什么问题
浏览器默认会在请求头中携带 Referer,告诉服务器”我从哪个页面来的”。这有两面:
- 有用:网站统计流量来源、防盗链、CSRF 检查
- 有风险:URL 中可能包含敏感信息(token、用户 ID、搜索词),泄露给第三方
Referrer-Policy 让你在”需要来源信息”和”保护隐私”之间找到平衡。
常用策略值
no-referrer
Referrer-Policy: no-referrer
完全不发送 Referer。最安全,但第三方无法知道流量来源。
same-origin
Referrer-Policy: same-origin
同源请求带完整 Referer,跨源请求不带。
strict-origin-when-cross-origin
Referrer-Policy: strict-origin-when-cross-origin
推荐默认值。规则如下:
| 场景 | 发送的 Referer |
|---|---|
| 同源请求 | 完整 URL(含路径和查询参数) |
| 跨源 HTTPS → HTTPS | 只带 origin(不含路径) |
| HTTPS → HTTP | 不带 |
origin
Referrer-Policy: origin
所有请求都只带 origin,不带路径。跨源时也能让对方知道来源域名,但不暴露具体页面。
origin-when-cross-origin
Referrer-Policy: origin-when-cross-origin
同源带完整 URL,跨源只带 origin。和 strict-origin-when-cross-origin 的区别是:HTTPS → HTTP 时仍然带 origin。
unsafe-url
Referrer-Policy: unsafe-url
所有请求都带完整 URL。不推荐,会泄露敏感路径信息。
完整策略对比
| 策略 | 同源 | 跨源 HTTPS→HTTPS | HTTPS→HTTP |
|---|---|---|---|
no-referrer | 不带 | 不带 | 不带 |
no-referrer-when-downgrade | 完整 URL | 完整 URL | 不带 |
same-origin | 完整 URL | 不带 | 不带 |
origin | 只 origin | 只 origin | 只 origin |
strict-origin | 只 origin | 只 origin | 不带 |
origin-when-cross-origin | 完整 URL | 只 origin | 只 origin |
strict-origin-when-cross-origin | 完整 URL | 只 origin | 不带 |
unsafe-url | 完整 URL | 完整 URL | 完整 URL |
推荐配置
大多数网站
Referrer-Policy: strict-origin-when-cross-origin
兼顾:
- 同源请求保留完整 URL(统计分析需要)
- 跨源 HTTPS 只暴露 origin(保护路径隐私)
- HTTPS→HTTP 不暴露任何信息(防止降级泄露)
完全不想暴露来源
Referrer-Policy: no-referrer
设置方式
HTTP 响应头
Referrer-Policy: strict-origin-when-cross-origin
HTML meta 标签
<meta name="referrer" content="strict-origin-when-cross-origin">
HTML meta 标签只影响当前页面发出的请求。响应头影响所有从该页面发起的请求。
边界与易混淆点
- Referer 拼写错误是历史遗留:HTTP 规范中 Referer 少了一个 r,一直沿用至今。
Referrer-Policy的拼写是正确的。 - Referrer-Policy 控制的是”请求发出时带多少”,不是”服务器收到多少”。
- 它是页面级策略:通过响应头或 meta 标签设置后,影响该页面发出的所有请求(跳转、子资源等)。
no-referrer-when-downgrade是旧版浏览器的默认值:现代浏览器通常默认strict-origin-when-cross-origin。