no-referrer 无法阻止 <a> 跳转等导航行为的 Referer 发送,仅作用于自动加载的子资源;真正有效的是 rel="noreferrer"(对 <a> 生效)或服务端 Referrer-Policy 响应头。

no-referrer 不能彻底隐藏站外跳转的来源页地址——它只对页面自动触发的资源请求(如 <img>、<script>)生效,对 <a> 点击跳转、window.location.href、表单提交等导航行为完全无效。
为什么 <meta name="referrer" content="no-referrer"> 对跳转没用
浏览器规范明确限定:<meta name="referrer"> 只影响该 HTML 解析后由标签自动发起的子资源请求,不干预用户主动导航行为。点击链接跳转时,Referer 由浏览器根据当前页面协议、目标 URL 协议及全局策略决定,和这个 <meta> 无关。
- Chrome 85+、Firefox 90+ 已默认忽略该写法,仅保留对旧资源加载的兼容支持
- 即使写了,DevTools Network 面板里看到跳转请求仍带 Referer,不是 bug,是预期行为
- 它不作用于
<iframe src>、fetch()、XMLHttpRequest或右键“在新标签页打开”
真正能控制跳转 Referer 的 HTML 方式只有 rel="noreferrer"
这是唯一无需 JS、标准化、且对 <a> 跳转直接生效的方案。它让浏览器在发起导航请求时彻底省略 Referer 请求头。
-
<a href="https://target.com" rel="noreferrer">跳转</a>→ 目标页收到的请求头中无Referer字段 - 同时自动启用
noopener,防止新页面通过window.opener访问原页面(安全副作用,但有益) - 兼容性极好:Chrome 4、Firefox 4、Safari 7、Edge 12+ 全支持
- 注意:只作用于当前链接,不继承;新页面里的后续跳转需各自加
rel="noreferrer"
如果必须全局控制所有跳转,只能靠服务端响应头
前端无法“统一拦截”所有跳转行为,唯一覆盖全部外发请求(含跳转、资源加载、fetch)的方式是设置 HTTP 响应头:
立即学习“前端免费学习笔记(深入)”;
-
Referrer-Policy: no-referrer—— 所有请求都不带 Referer,最彻底,但会丢失内部统计能力 -
Referrer-Policy: strict-origin-when-cross-origin—— 同域传完整 URL,跨域只传 origin,HTTPS→HTTP 不发,更平衡 - Nginx 示例:
add_header Referrer-Policy "no-referrer"; - 该头优先级高于任何
<meta>或元素属性,且现代浏览器(Chrome 56+、Firefox 50+、Safari 11.1+)均支持
容易被忽略的一点:即使你用了 rel="noreferrer",用户右键“在新标签页中打开”,或复制链接手动访问,Referer 依然按浏览器默认策略(no-referrer-when-downgrade)发送——这是浏览器行为,前端无法干预。



















