srcset 与 referrerpolicy 必须配合使用才能绕过防盗链,单独 srcset 无效;需设 referrerpolicy="origin-when-cross-origin" 并用 aspect-ratio 预留空间,onerror 回退需加 crossorigin="anonymous"。

srcset + referrerpolicy 一起用才能绕过防盗链
单纯写 srcset 不会自动解决防盗链问题,关键在于浏览器对每个 srcset 候选项发起请求时,仍会携带 Referer。如果目标服务器校验 Referer,且你页面域名不在白名单里,所有候选项都会返回 403。
必须显式设置 referrerpolicy 属性,控制单个 的 Referer 行为:
-
referrerpolicy="no-referrer":最彻底,完全不发 Referer,但会丢失来源信息(如统计、AB 测试) -
referrerpolicy="origin-when-cross-origin":跨域时只发域名,兼顾兼容性与基本隐私,推荐日常使用 - 不要全局设
,它会影响所有请求(包括 API、字体、脚本),范围过大易出问题
示例写法:
@@##@@
占位符必须撑开空间,否则 layout shift 无法避免
很多开发者以为加个灰色背景就算占位了,结果图片加载后文字上推——根本原因是容器没预留高度,浏览器渲染流里“盒模型缺失”,强制重排不可避免。
现代方案优先用 CSS aspect-ratio:
-
aspect-ratio: 16/9+width: 100%是首选,无需 JS,响应式天然支持 - Safari 15.3 及更早版本不支持
aspect-ratio,需回退:height: 0; padding-bottom: 56.25%; position: relative;,再把设为
position: absolute; - 禁用
min-height或max-width替代,它们不参与初始布局计算,无法阻止塌陷
纯 CSS 渐变占位更稳:
实现 Markdown↔ HTML 互转,支持导出 PDF,用于用户请求的文档格式转换。
.img-placeholder {
background: linear-gradient(#e0e0e0, #f5f5f5);
background-size: cover;
background-repeat: no-repeat;
background-origin: content-box;
}
onerror 处理防盗链失败要防静默失效
当防盗链图片加载失败时,onerror 很可能不触发——尤其在跨域场景下未设 crossorigin 属性时,浏览器出于安全限制会静默丢弃错误,既不报错也不调用回调。
必须组合使用:
- 显式添加
crossorigin="anonymous",让浏览器允许跨域错误暴露(即使图片最终 403,也能进onerror) -
onerror回调里不能直接改this.src指向同一域名的另一张图,否则可能再次触发防盗链,形成死循环 - 稳妥做法是 fallback 到本地资源或 base64 内联小图(注意 Android WebView 对大 base64 支持不稳定,建议 ≤2KB)
示例:
@@##@@
iframe 方案看似黑科技,实则脆弱且难维护
用 iframe + javascript:void(...) 动态写入图片来清空 Referer,原理上可行,但实际落地极容易翻车:
- 一旦页面中存在任何同源图片(哪怕一张 favicon.ico 请求),Referer 就可能被继承,导致 iframe 内图片仍被拦截
- 现代浏览器对
javascript:协议的执行越来越严格,部分版本会直接拒绝解析或触发 CSP 报错 - 无法配合
loading="lazy"、decoding="async"等性能属性,且 iframe 自身有额外渲染开销 - SEO 和无障碍支持几乎为零,爬虫和读屏器通常忽略 iframe 内容
真正可控的路径只有两条:服务端配白名单(最正统),或前端用 referrerpolicy + 合理 fallback。其他“黑科技”只适合临时调试,别进生产环境。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










