五一前几天,国内最大的免费图床——新浪微博终于还是启用了防盗链机制,一时间那些大量引用其做为外链图片的站点变得“惨白”一片(使用浏览器打开网页敲 F12,所有上传在微博上的图片全部403),酷睿所运营的 人人赚网赚论坛 就是其中之一,这是不让人好好过节的节奏…还是想让人劳动节好好劳动劳动…
↑↑↑ 原本新浪微博外链图片所在位置一片空白 ↑↑↑
那么,这个问题该如何解决呢?首先,据我所知,这个防盗链机制是有一个白名单的,白名单上的网址来源是不会被限制的,不然你想那些引用新浪微博图片的大型站点或应用不在少数,难不成要让它们全挂掉?所以,如果你的站点是正规的,而且有了一定的规模,应该不会受影响;如果万一受影响了,联系下新浪,应该还是乐意帮你解决的。
至于小站点们也不要慌,首先微博相册上的图片是没有被删掉也不可能没经过你的同意就删掉的,只是不让外链了而已。所以根本的解决方案当然是放弃新浪微博图床,或者说直接放弃图床网站(有人说可以将图片转移到其他的图床网站上,可是你想连新浪微博这么大体量的站点说拜就拜了,其他站点又有什么保障呢?),将引用的图片转移回自己的服务器上保存!
可是那成千上万的图片要转移回目前容量紧张兮兮的服务器上,想想都够呛,于是酷睿暂时没有采取这个方案。那有什么临时的解决方案吗?酷睿研究了一下,发现新浪微博外链图片的网址域名前缀有多种,其中 wx1/2/3/4、ww1/2/3/4 与 ws1/2/3/4 为前缀的节点目前都被限制了,而 tva1/2/3/4 为前缀的节点目前仍可顺利打开(这个前缀知道的人貌似不多~)。那么只要把网址前缀中的 wx、ww 与 ws 都改成 tva 应该就可以暂时继续使用微博图床的外链图片了。
那么具体该如何操作呢?如果站点上使用的图片链接不多,那一条条手工改一下是没有什么问题,可如果有成千上万条链接需要修改,手工操作就不好玩了,而且还容易遗漏…那有什么办法来批量完成该操作吗?有的!这里我们使用数据库技术,写几条 SQL 语句即可完成所有操作!参考步骤如下——
1. 关闭站点,备份数据库。这点非常重要!备份数据库是防止我们误操作时吃的“后悔药”,而暂时关闭站点是为了防止修改数据库期间仍有用户在访问,这就有可能产生新的数据,造成数据遗漏。以后只要是手工执行数据库操作时,最好都要记得这一步!
2. 找出需要修改的链接所在的数据库表格及列。如酷睿所要修改的是 Discuz! 搭建的论坛中的帖子所包含的链接,其位于 pre_forum_post 表中的 message 列;而使用 WordPress 搭建的博客中的文章所包含的链接则位于 wp_posts 表中的 post_content 列中。
3. 执行 SQL 语句批量修改链接。格式如下:
UPDATE 表名 SET 列名 = REPLACE(列名, 'wx1.sinaimg.cn', 'tva1.sinaimg.cn');
例如:
UPDATE pre_forum_post SET message = REPLACE(message, 'wx1.sinaimg.cn', 'tva1.sinaimg.cn');
UPDATE pre_forum_post SET message = REPLACE(message, 'wx2.sinaimg.cn', 'tva2.sinaimg.cn');
UPDATE pre_forum_post SET message = REPLACE(message, 'wx3.sinaimg.cn', 'tva3.sinaimg.cn');
UPDATE pre_forum_post SET message = REPLACE(message, 'wx4.sinaimg.cn', 'tva4.sinaimg.cn');
UPDATE pre_forum_post SET message = REPLACE(message, 'ww1.sinaimg.cn', 'tva1.sinaimg.cn');
UPDATE pre_forum_post SET message = REPLACE(message, 'ww2.sinaimg.cn', 'tva2.sinaimg.cn');
UPDATE pre_forum_post SET message = REPLACE(message, 'ww3.sinaimg.cn', 'tva3.sinaimg.cn');
UPDATE pre_forum_post SET message = REPLACE(message, 'ww4.sinaimg.cn', 'tva4.sinaimg.cn');
UPDATE pre_forum_post SET message = REPLACE(message, 'ws1.sinaimg.cn', 'tva1.sinaimg.cn');
UPDATE pre_forum_post SET message = REPLACE(message, 'ws2.sinaimg.cn', 'tva2.sinaimg.cn');
UPDATE pre_forum_post SET message = REPLACE(message, 'ws3.sinaimg.cn', 'tva3.sinaimg.cn');
UPDATE pre_forum_post SET message = REPLACE(message, 'ws4.sinaimg.cn', 'tva4.sinaimg.cn');
4. SQL 执行完成后,使用网站管理员账号查看下图片是否已恢复正常显示,OK 的话就可以恢复站点访问了。如果还是无法显示,查看下你所引用的图片链接是不是使用了 https:// ,是的话再把它批量修改为 http:// 应该就没问题了,如:
UPDATE pre_forum_post SET message = REPLACE(message, 'https://tva1.sinaimg.cn', 'http://tva1.sinaimg.cn');
当然,本文分享的只是临时的应急方案,新浪微博随时可能把最后这些节点也关了不跟你玩了,所以还是尽快想办法把图片保存到自己的服务器上吧,这才是最好的容灾方式!