必须用HTTP响应头Referrer-Policy全局兜底,referrerpolicy属性仅对、<img>、<iframe>等主动请求标签的单次请求生效,二者不可替代:响应头覆盖fetch()/XMLHttpRequest/资源加载等HTML属性无法控制的场景,局部属性优先级高但范围有限。

直接结论:必须用 HTTP 响应头 Referrer-Policy 全局兜底,referrerpolicy 属性只对特定标签的单次请求有效,二者不能互相替代,混用时局部优先但覆盖范围有限。
为什么响应头 Referrer-Policy 是必选项
它控制所有本域发起的请求,包括 JS 的 fetch()、XMLHttpRequest、CSS/JS/字体加载、甚至 Service Worker 请求——这些是 HTML 属性完全管不到的。比如埋点 SDK 自动上报、图片懒加载触发的 new Image().src = ...,都只认响应头。
常见错误现象:referrerpolicy="no-referrer" 加在 <a> 上,但用户点击后新页面里 JS 仍发带完整 Referer 的请求,审计发现敏感参数泄露。
- Nginx 配置示例:
add_header Referrer-Policy "strict-origin-when-cross-origin"; - FastAPI 自定义中间件中设
response.headers["Referrer-Policy"] = "strict-origin-when-cross-origin" - 响应头优先级最高,会覆盖
<meta name="referrer">和大部分标签属性(no-referrer除外)
referrerpolicy 属性该加在哪些标签上才生效
它只对「主动发起网络请求」的 HTML 元素起作用,且仅影响该元素触发的这一次请求,不继承、不传递。
立即学习“前端免费学习笔记(深入)”;
支持的标签包括:<a>、<img>、<iframe>、<script>、<link>、<form>、<video>;不支持 <div>、<p> 等纯容器标签。
-
<a href="https://thirdparty.com" referrerpolicy="origin">跳转</a>:控制点击跳转时的 Referer -
<img src="https://cdn.example.com/photo.jpg" referrerpolicy="no-referrer">:防止图床因 Referer 校验返回 403 -
<form action="/api/submit" referrerpolicy="origin">:避免提交时泄露当前页面完整路径 - 错误写法:
<div referrerpolicy="no-referrer"></div>—— 浏览器直接忽略
选值不当会导致图片不显示或隐私泄露
unsafe-url 是唯一明确禁止的值:它强制发送完整 URL(含 ?token=xxx、?user_id=123),生产环境禁用。而 same-origin 和 strict-origin 在 <img> 上实际无效,旧版 Safari 会降级处理,别用。
- 对外链跳转,优先用
rel="noreferrer"而非referrerpolicy="no-referrer":前者彻底移除 Referer 头,还隐式启用noopener防 window.opener 劫持 - CDN 图片加载失败(403)时,先查服务端是否校验 Referer,再试
referrerpolicy="origin"或"no-referrer" - 设了
referrerpolicy="origin"却看到完整 URL?可能是浏览器太老(Safari ≤15.4 不支持),或被响应头覆盖
验证是否真生效,别只信 DevTools Network 面板
Network 面板里看到的 Referer 可能被缓存、重定向或浏览器预加载干扰,最可靠方式是让目标服务端打印原始请求头。
- 本地快速验证:
python3 -m http.server 8000启服务,把链接指向它,看终端输出是否有Referer:行及内容 - 对敏感页(如
/dashboard?session=abc123)点击外链,检查目标站收到的是https://yoursite.com还是完整 URL - 注意右键“在新标签页打开”行为:
referrerpolicy对它无效,必须配rel="noreferrer"才能覆盖
真正麻烦的不是写错一个属性,而是 CDN、图床、前端构建工具、代理层各自有 Referer 策略,得一层层查响应头和日志,而不是只改 HTML 标签。



















