<meta name="referrer" content="no-referrer">仅对页面解析后自动发起的同域/跨域资源请求(如<img>、<script>)生效,且必须置于<head>最前;它对导航跳转、fetch、XMLHttpRequest无效,且优先级低于HTTP响应头Referrer-Policy。

Referrer策略在meta中怎么写才有效
HTML里用 <meta> 设置 Referrer 策略,只对当前页面发起的**同域或跨域请求**(比如图片、脚本、iframe、fetch/fetch API)起作用,但对直接点击链接跳转、location.href跳转、表单提交等行为无效——这些走的是浏览器导航机制,由响应头 Referrer-Policy 控制,不是 <meta> 能管的。
真正能生效的写法只有这一种:
<meta name="referrer" content="no-referrer">
注意:name="referrer" 是旧规范(HTML5.2前),现在推荐用标准属性 referrerpolicy,但它**不能写在 <meta> 里**,必须写在具体资源标签上,比如:
<img src="https://cdn.example.com/photo.jpg" referrerpolicy="no-referrer"><br><script src="https://cdn.example.com/lib.js" referrerpolicy="strict-origin-when-cross-origin"></script>
为什么经常不生效
常见失效原因不是语法错,而是优先级和覆盖关系没理清:
立即学习“前端免费学习笔记(深入)”;
- 如果页面同时设置了 HTTP 响应头
Referrer-Policy: strict-origin,它会**完全忽略**<meta name="referrer">的值 -
<meta name="referrer">只影响该 HTML 解析后发起的子资源请求,不影响页面本身被谁访问时“暴露给目标站”的 referrer(那是服务端或跳转方控制的) - Chrome 85+、Firefox 90+ 已默认禁用
name="referrer"的 meta 写法,仅支持referrerpolicy属性 + 响应头 - 写在
<head>后半部分?晚了。必须是<head>最早几个标签之一,否则解析到它之前发出的资源请求已按默认策略发出去了
防盗链真正该控制哪一端
想防别人盗用你的图片/CSS/JS,关键不在“我发请求时不带 referrer”,而在“别人请求我的资源时,我拒绝没有合法 referrer 的请求”——也就是服务端校验:
- Nginx 配置示例:
valid_referers none blocked server_names *.mydomain.com;+if ($invalid_referer) { return 403; } - CDN 如 Cloudflare、阿里云 CDN 都提供“Referer 黑白名单”规则,比前端 meta 更可靠、更可控
- 前端设
referrerpolicy="no-referrer"只能防止你自己的页面把 referrer 泄露给第三方,对别人扒你资源毫无阻拦作用
referrerpolicy 值选哪个最实用
日常开发中这几个值够用,别贪多:
-
no-referrer:发请求时彻底清空 Referer 头(适合敏感操作、避免泄露路径) -
origin:只发源站(https://a.com),不带路径(https://a.com/page?x=1→https://a.com),平衡安全与统计可用性 -
strict-origin-when-cross-origin:默认值,同域传完整 referrer,跨域只传 origin,且 HTTPS→HTTP 时清空(最稳妥)
别用 unsafe-url,它会把完整 URL 当 referrer 发出去,存在隐私泄漏风险;也别依赖 <meta> 做防盗链,那只是幻觉。



















