是唯一有效的 HTML 元标签,必须小写 origin 且置于 顶部;referrerpolicy 属性仅用于元素级,二者不兼容;HTTP 响应头 Referrer-Policy 优先级最高,覆盖所有请求类型,包括 JS 动态请求和错误页。

meta name="referrer" 和 referrerpolicy 是两套不兼容的机制
你不能在 标签里写 referrerpolicy —— 浏览器会直接忽略。正确的属性名是 name="referrer",且只认 content 值为小写 origin、no-referrer 等有限枚举。如果写成 ,它完全无效,浏览器按默认策略 no-referrer-when-downgrade 处理。
origin 必须用 ,且位置和拼写零容错
要让 origin 生效,必须满足三个硬性条件:
-
必须放在最顶部,早于任何<script></script>、或其他可能触发请求的标签 -
content值严格小写:origin——Origin、ORIGIN、orgin全部静默失败,退回到默认策略 - 该 meta 只影响后续由 HTML 自动发起的请求:a 标签跳转、
、<script src></script>、、提交(未显式设referrerpolicy时)
HTTP 响应头 Referrer-Policy 才是真正的“安全头”
所谓“安全头”,指的是服务器通过 HTTP 响应头统一控制所有请求行为,包括 JS 的 fetch()、动态创建的 、CSS 中的 url() 等 完全管不到的场景。Nginx 配置示例:
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
注意 always 关键字 —— 它确保 4xx/5xx 错误页也生效,避免 /admin?token=xxx 这类路径在报错时意外泄露。这个头优先级高于所有 HTML 层设置,包括 和元素级 referrerpolicy 属性。
别指望 meta 覆盖全部,JS 请求必须单独处理
如果你页面里有类似这样的代码:
fetch("https://api.thirdparty.com/log", { method: "POST" });
那么 对它毫无作用。必须显式传参:
fetch("https://api.thirdparty.com/log", {
method: "POST",
referrerPolicy: "origin"
});
同理,XMLHttpRequest、动态 document.createElement("img")、甚至 内部 JS 发起的请求,都不受 meta 控制 —— 它们要么靠响应头,要么靠 JS 层参数。
真正容易被忽略的是:右键“在新标签页中打开链接”完全绕过所有 HTML 层策略,浏览器按自身默认逻辑发 Referer;而 rel="noreferrer" 会强制覆盖同标签上的 referrerpolicy,导致策略失效。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











