问题描述
从微信公众号中拿到的图片url需要在前端页面中展示,看了许多资料大概:为了防止其他平台引入,特意做了类似防盗链的功能,即使是添加了业务域名,也是如此,效果如图
防盗链原理
在 http
协议请求中 header
里会带个 Referer
字段。通过图片服务器检查 Referer
是否来自规定的域名(白名单),而进行防盗链。 在浏览器中输入防盗链图片地址是能直接访问的。
引用策略说明:
- HTTP有一个概念叫做引用策略(Referrer Policy),简单理解就是在Request头中是否发送Referrer头
- 浏览器可以通过meta标签去设置引用策略,上面的name可以理解为策略key,content可以理解为策略value
- 默认情况下的引用策略是Referrer Policy:no-referrer-when-downgrade,会在被访问网站安全的情况下在Request头中是否发送Referrer: location.origin
- 当设置为name="referrer" content="no-referrer"时,Referrer Policy:no-referrer,请求头Request中不会带上Referrer头
解决方案
根据图片请求的头部的referer属性做来源判断,
1.header中添加(根据页面要求在.html中增加 meta)
<meta name="referrer" content="never">
2.图片的img标签上添加 referrerpolicy="no-referrer"解决
<img src="xxxxxx" referrerPolicy="no-referrer" />
第三方代理(参考)不稳定!!
<img src="https://images.weserv.nl/?url=https://p9-passport.byteacctimg.com/img/user-avatar/f9166aceb85b42133f48537808cef8eb~300x300.image"/>