base标签的target属性仅对相对url且未显式声明target的、、标签生效,不影响javascript导航和绝对url;必须配合rel="noopener"防安全风险。

base 标签的 target 属性到底起不起作用
<base> 的 target 属性只对**相对 URL 触发的跳转行为**生效,且仅影响 @#@#@#@#@#@#@#@#@#@0 → 新窗口打开;但 <a href="https://site.com/contact.html"></a> 或 <a href="contact.html" target="_self"></a> 都不受影响。
target="_blank" 必须配 rel="noopener" 吗
必须。如果 <base target="_blank"> 生效,而你又没在页面里统一加 rel="noopener",那么所有被它影响的链接都会缺失这个安全属性。
这会导致新页面可通过 window.opener 访问原页面的 window 对象,存在安全隐患(比如被跳转页执行 window.opener.location = "phishing.com")。
解决办法只有两个:
- 放弃
<base target="_blank">,改用显式写<a href="..." target="_blank" rel="noopener"></a> - 保留
<base>,但务必在中紧随其后加:<meta name="referrer" content="no-referrer">,并确保所有表单和图片映射区(<area>)也符合安全要求(它们不支持rel,所以更推荐第一种)
替代方案:用 JavaScript 统一控制更可靠
想让所有相对链接都新窗口打开且带 rel="noopener"?<base> 做不到,JS 可以:
document.querySelectorAll('a[href]:not([href^="http"]):not([href^="//"]):not([href^="mailto:"])').forEach(a => {
if (!a.hasAttribute('target')) {
a.target = '_blank';
a.rel = 'noopener';
}
});
注意点:
- 这个选择器排除了绝对 URL,但无法完美识别 protocol-relative URL(如
//cdn.com/js.js),需按需调整正则 - 要早于 DOM 渲染完成时执行(比如放在
底部或用DOMContentLoaded) - 如果页面有服务端渲染或动态插入链接,得额外监听或封装成函数重跑
真正麻烦的不是怎么设 target,而是怎么确保它既生效、又安全、还能覆盖所有边缘场景——<base> 太静态,反而容易漏掉 rel 或误伤绝对链接。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











