referrerpolicy 属性仅对主动发起请求的标签(如、、、、、)有效,加错位置、拼错值或误用于js请求均失效;strict-origin-when-cross-origin在跨源https请求中只发送origin,更安全;常见失效原因包括拼写错误、混用rel="noreferrer"、误配或忽略下游校验。

referrerpolicy 属性不能“自动保护隐私”,它只在你明确加到具体标签上、且值选对的前提下,才裁剪 Referer 头里的敏感路径和参数——加错位置、拼错值、或指望它管 JS 请求,都会失效。
referrerpolicy 必须加在哪些 HTML 标签上才起作用
它只对主动发起网络请求的元素生效,且仅影响该次请求。浏览器会直接忽略加在 <div>、<code><p></p> 这类容器标签上的属性。
-
<a></a>:控制点击跳转时的 Referer(但右键“在新标签页打开”会绕过) -
<img>、<script></script>、<link rel="stylesheet">、<link rel="preload">:控制资源加载时的 Referer -
<iframe></iframe>:控制 iframe 内部 JS 发起的请求(不是父页面向它发的请求) -
<form></form>:控制 GET/POST 提交时的 Referer(不影响fetch()提交)
strict-origin-when-cross-origin 为什么比默认值更安全
默认策略 no-referrer-when-downgrade 在 HTTPS → HTTPS 跨域跳转时仍发送完整 URL,比如从 https://site.com/admin/user?id=123&token=abc 跳到第三方支付页,对方收到的就是带参全路径。
而 strict-origin-when-cross-origin 在同样场景下只发 https://site.com,路径和查询参数彻底消失。
- 同源请求:发完整 URL(保留内部统计逻辑)
- 跨源 HTTPS 请求:只发 origin(协议+域名+端口)
- HTTPS → HTTP:不发 Referer(防明文泄露)
常见错误:加了 referrerpolicy 却没效果
这不是配置失败,而是机制被误读。典型问题包括:
- 拼写错误:
origin-when-crossorigin(少个-)会被静默降级为no-referrer-when-downgrade - 混用
rel="noreferrer":它会强制覆盖referrerpolicy,等效于no-referrer - 加在
<meta name="referrer">里:这个只影响后续导航类行为,对<img>、<script></script>加载完全无效 - 以为能控制 fetch():动态 JS 请求必须靠
fetch(url, {referrerPolicy: 'no-referrer'})或服务端响应头
CDN 图片 403 或埋点失效,其实是下游校验逻辑没对齐
referrerpolicy 只裁剪 Referer 头,不决定下游是否接受请求。如果 CDN 设置白名单只允许 https://yoursite.com/*(要求完整路径),而你用了 origin,它就只收到 https://yoursite.com,自然 403。
- CDN 返回 403?检查它是否校验完整 Referer,还是只认 origin
- 埋点日志里 Referer 为空?说明用了
no-referrer,但后端统计依赖 Referer 归因 - Safari 15.3 以下版本不支持
origin-when-cross-origin,会回退到默认策略,造成统计口径不一致
真正起效的关键不在“加没加”,而在“加在哪”“值对不对”“下游认不认”。一个 <img> 标签加了 referrerpolicy="origin" 就只管这张图;换一个 <script></script>,就得单独再加——它不是开关,是扳手,每次只能拧一颗螺丝。











