从前天开始,我手上的几个网站出现了部分图片无法加载的情况,所有用新浪微博做外链的图片统统返回了403错误。起初我以为是网络不稳定而导致图片无法加载,可换了几个网络环境之后,问题依旧存在,这才意识到可能是新浪开始对外链图片做限制了。
众所周知,新浪微博在此之前由于不会对图片做防外链处理,国内CDN节点众多,而被无数站长当成免费“图床”来使用。然而羊毛被撸多了,新浪不堪重负也最终选择了开启防盗链。好在新浪并没有删除我们存放的图片,图片通过浏览器直接打开是可以访问的。但是对于我们这些将百分之七八十的图片统统放在新浪的站长,转移这些图片无疑是一场噩梦。
我在谷歌上搜索了一下,目前网上流传着几种解决方案:
加一个noreferer头
具体方法是在head中加入一行html代码,让浏览器在访问该页面时候不再带上referer标记。这也就相当于直接访问这个图片,绕开了微博的防盗链机制。
<meta name="referrer" content="no-referer" />
当然这个方法有一个缺点,就是缺少了referer站点的来源数据统计将会不再准确,部分依赖referer的功能会受到影响。
给图片单独加noreferer
不给全站加上never,我们还可以考虑单独给图片加上never标签。
<img alt="image" class="has" src="http://……" referrerPolicy="no-referrer">
知道原理以后,我们就可以对数据库进行批量修改:
UPDATE wp_posts SET post_content = REPLACE (post_content, '<img', '<img referrerPolicy="no-referrer"')
这个方法也有个缺点,那就是IE与Edge不兼容,使用低版本浏览器的用户依然会携带referer请求。
将图片从https改为http协议
这种方法其实是利用了浏览器的referrerPolicy中的 no-referrer-when-downgrade 策略,当https站点加载http内容时,浏览器不会发送referrer请求。该方法对http站点无效。
使用反向代理代理图床
这个方法大致思路是客户端请求代理服务器获取图片,代理服务器发送不带referer的请求到新浪图床,新浪图床返回给代理服务器,最终图片返回给客户端。
这个流程走下来,图片的加载速度肯定会慢上不少,但是对于大量图片在微博的站长来说,也不失为一个临时的应急的方案。
以宝塔为例,创建一个新的站点,例如我这使用 sinaimg.supertyler.com 作为我的代理域名。
网站若开启了HTTPS请先设置SSL证书,然后设置反向代理,目标URL为 http://wx1.sinaimg.cn,选择开启缓存,如下图:
编辑该条反向代理,添加一条设置referer为空的语句。
proxy_set_header referer "";
这样反向服务器搭建完毕,现在开始替换数据库中的图床url。输入以下命令,注意将你的代理服务器域名替换成你对应的域名。
UPDATE wp_posts
SET post_content = REPLACE (post_content, 'http://wx1.sinaimg.cn', 'https://你的代理服务器域名.com')
这里要注意新浪有多个图床地址,分别为
http://wx1.sinaimg.cn
http://wx2.sinaimg.cn
http://wx3.sinaimg.cn
http://wx4.sinaimg.cn
http://ws1.sinaimg.cn
http://ws2.sinaimg.cn
http://ws3.sinaimg.cn
http://ws4.sinaimg.cn
http://ww1.sinaimg.cn
http://ww2.sinaimg.cn
http://ww3.sinaimg.cn
需要将这些域名逐一进行替换。
最新的可外链新浪图床域名
(2020年1月12日更新)
tvax1.sinaimg.cn
tvax2.sinaimg.cn
tvax3.sinaimg.cn
tvax4.sinaimg.cn
tva1.sinaimg.cn
tva2.sinaimg.cn
tva3.sinaimg.cn
tva4.sinaimg.cn
参考文章: