content="never" 已被废弃,必须改用 content="no-referrer",否则浏览器静默降级为 no-referrer-when-downgrade,导致防盗链失效;该 meta 仅控制 HTML 自动加载的子资源,对 JS 请求、用户操作等无效。

content="never" 已被所有现代浏览器废弃,必须改用 content="no-referrer",否则会静默降级为 no-referrer-when-downgrade,防盗链大概率失效。
为什么 meta name="referrer" 写 never 不起作用
W3C 在 2016 年统一规范后,never 就不再是合法值。Chrome 59+、Firefox 60+、Edge 79+、Safari 11.1+ 都会把它当非法字符串处理,直接 fallback 到默认策略 no-referrer-when-downgrade —— 这意味着 HTTPS 页面引用 HTTP 图片时仍会发 Referer,而很多防盗链服务(比如微信公众号图床)只认空 Referer。
- DevTools Network 面板里看到某张图请求头仍有
Referer: https://xxx.com/page,八成就是这个原因 - 浏览器不报错、不警告,只默默改策略,非常难排查
- 旧版 Safari 或某些 WebView 可能直接忽略该
meta,退回到更宽松的默认行为
meta name="referrer" 实际生效范围很窄
它只控制 HTML 文档**自动发起的资源加载请求**,和你手点、JS 主动发的请求完全无关:
- ✅ 生效:
<img src="https://cdn.example.com/1.jpg">、<script src="lib.js">、CSS 中background: url()、<iframe src=""> - ❌ 不生效:
fetch()/XMLHttpRequest(需显式传referrerPolicy: 'no-referrer')、用户右键“在新标签页打开”、window.open()、location.href跳转 - ⚠️ 注意:
no-referrer还会清空window.opener,这点比 JS 控制更彻底
怎么配才真正让防盗链生效
单写一个 <meta name="referrer" content="no-referrer"> 往往不够,尤其面对微信等平台校验完整 Referer 字符串的场景:
立即学习“前端免费学习笔记(深入)”;
- 必须放在
<head>最前面,最好紧贴<title>后面——解析到就生效,后面插入的无效 - 如果页面是 HTTPS,而图片是 HTTP,即使不设
no-referrer,默认策略也会清 Referer,此时加meta反而多余 - 对微信图片,光禁 Referer 不够;很多平台还校验
User-Agent或 Referer 是否来自微信内置浏览器,这时得配合服务端代理或 CORS 处理 - 验证是否生效:用手机微信打开页面 → Network → 点开某张图请求 → 查看 Request Headers → 找
Referrer Policy字段是否显示no-referrer
别指望 meta 保护 HTML 本身
HTML 文件是入口资源,浏览器直接打开时 Referer 为空、Origin 为 null,Nginx 的 valid_referers 或后端中间件的 if request.headers.get('Referer') 对 /index.html 完全无效——它只对被 HTML 引用的子资源(如 <img src="logo.png">)起作用。
真正值得投入的点是:把敏感内容从 HTML 模板里剥离,改由 AJAX/Fetch 加载,并强制校验 Authorization 或 session;HTML 里只留占位容器。防盗链本质是资源层的事,不是页面层的事。



















