外链用 target=_blank 打开,新页面里一段 window.opener.location 就能把原标签页跳到别的站,用户回头发现原页面没了。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,新窗口默认保留 opener 引用,目标页拿到之后可以改写来源页地址。老浏览器不支持 rel=noopener 时会忽略这个属性,需要脚本兜底。
「noopener 安全」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。报错里带路径的,先去看那个路径在不在、权限对不对。
<a href='https://external.example.com' target='_blank' rel='noopener noreferrer'>外链</a> // 动态创建:a.rel = 'noopener noreferrer'
同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
具体做法是,所有 target=_blank 的链接补 rel=noopener noreferrer;不支持该属性的环境用脚本把 opener 置空;用安全扫描跑一遍 确认动态插入的链接也覆盖。
最后用这个标准收尾,打开外链后,在新页面控制台执行 window.opener 得到 null,原标签页地址不变。
