rel="noopener"是安全底线,必须与target="_blank"共用以切断window.opener控制;rel="noreferrer"则主动清空Referer影响数据归因,二者功能独立不可替代。

rel="noopener" 是安全底线,不是可选项
它唯一作用是让新页面的 window.opener 变成 null,彻底切断 JS 层面对原页面的控制能力。不加它,恶意外链就能执行 window.opener.location.href = 'https://fake-login.com',把用户无声劫持。
现代浏览器(Chrome 90+、Firefox 85+、Edge 90+)对 target="_blank" 已默认启用 noopener 行为,但这个“默认”只在特定条件下生效:必须是用户主动点击、且未被 JS 拦截或重定向。服务端渲染、富文本编辑器自动注入、CMS 后台生成的链接,常漏掉 target="_blank" 或没配 rel,这时旧版 Safari 或 WebView 就可能中招。
-
rel="noopener"必须和target="_blank"同时存在才起作用,单独写无效 - 不要用
rel="noreferrer"替代它——早期 Chrome 和 Safari 中,noreferrer不保证window.opener === null - 写法顺序建议固定为
rel="noopener noreferrer",部分 Markdown 解析器会按顺序取第一个合法值
rel="noreferrer" 是隐私开关,会影响数据归因
它真实清空 Referer 请求头和 document.referrer,目标站点完全收不到你从哪来的。这不是浏览器“默认行为”,而是你主动关掉的——没写就是发,写了就一定不发。
后果很直接:GA、百度统计、自建埋点里,这类点击流量全变成「直接访问」。如果你靠 referrer 做渠道分流、AB 测试、合作方效果结算,加了 noreferrer 就等于主动丢数据。
立即学习“前端免费学习笔记(深入)”;
- HTTPS 站点之间本就只传 origin(如
https://a.com),不传完整路径,所以对隐私提升有限 - 想精细控制可以换
referrerpolicy="no-referrer-when-downgrade"或"strict-origin",比noreferrer更灵活 -
noreferrer不解决 opener 安全问题,也不能替代noopener
为什么总看到它们一起写?
因为历史兼容性 + 场景叠加:早期 noreferrer 在部分浏览器里会附带 noopener 效果,后来规范拆开,但组合写法成了惯性。现在它本质是两件事拼在一起——noopener 防劫持,noreferrer 隐来源。
真正容易被忽略的是:很多团队把它当“安全标配”批量注入,却没评估业务是否依赖 referrer。比如电商跳转到支付平台、SaaS 跳转到第三方登录页,referrerpolicy 往往比 noreferrer 更合适。
- 如果只关心安全,至少保留
rel="noopener" - 如果 referrer 是归因链关键一环,就别加
noreferrer,哪怕多一行配置也要权衡 -
window.open()不吃rel属性,得用window.open(url, "_blank", "noopener=yes")(仅 Chrome/Edge 支持)或改用其他跳转方案



















