rel="noopener"在解析阶段使新页面window.opener为null,从源头切断引用链,必须与target="_blank"配合使用才生效;单独使用无效,且不适用于window.open()。

rel="noopener"在解析阶段就让window.opener为null
它不是运行时拦截或属性过滤,而是在浏览器创建新浏览上下文(比如新 tab)的瞬间,跳过设置 window.opener 字段这一步。子页面一加载,window.opener 就已经是 null,连读取都失败,更别说调用 window.opener.location.replace() 或 window.opener.postMessage()。
必须和target="_blank"一起用才生效
单独写 rel="noopener" 没有任何作用——浏览器只在遇到 target="_blank"(或 target="_popup" 等非当前上下文目标)时,才触发 opener 隔离逻辑。
-
@#@#@#@#@#@#@#@#@#@0→ 无效:没target="_blank",不创建新上下文,window.opener不受影响 -
@#@#@#@#@#@#@#@#@#@1→ 有效:新 tab 中window.opener === null -
@#@#@#@#@#@#@#@#@#@2→ 无效:同上下文跳转,opener 本就不存,加了也白加
window.open()里不能靠rel属性控制
rel 是 HTML 属性,对 JS 主动打开的窗口完全无效。写 window.open(url, "_blank", "noopener") 是错的——noopener 不是合法的 features 字符串参数。
- Chrome/Edge 支持
window.open(url, "_blank", "noopener=yes"),但 Safari 和旧版 Firefox 不认 - 最稳妥做法:改用
location.replace()+ 新窗口监听,或直接回归<a target="_blank" rel="noopener noreferrer"></a>触发 - 绝对不要只写
window.open(url)或window.open(url, "_blank"),默认保留window.opener引用
rel="noreferrer"不等于rel="noopener"
rel="noreferrer" 主要控制 HTTP 请求头中是否发送 Referer 字段,它在多数现代浏览器中会隐式启用 noopener,但行为不保证一致:
- 旧版 Safari(≤12.0)和某些 WebView 中,
rel="noreferrer"不保证window.opener === null - IE11 完全不支持
rel="noopener",且rel="noreferrer"在 IE11 中只隐藏 Referer,不切断 opener - 显式同时写
rel="noopener noreferrer"才能兼顾兼容性、安全底线与隐私保护
target="_blank",却漏掉 rel。这类“半截子”链接上线后就是高危入口,且静态扫描很难覆盖动态生成场景。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











