“免费图床”时代终结 新浪开始限制图片外链 附解决方案
服务器运维
2019-04-27
3931
0

从前天开始,我手上的几个网站出现了部分图片无法加载的情况,所有用新浪微博做外链的图片统统返回了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

参考文章:

  1. Referrer策略与防盗链
  2. 一种新的可应对空白 referer 的防盗链策略