新浪微博图床防盗链了,我们知道这一天终究会来的,只是来得比大家预期的都要早,以为还可以安心的用几年呢。就算是当初“weibo.com 这个域名我要了,你开个价,我不还价”这般财大气粗,依然经不住粗水长流的流量费用。那么新浪微博图床防盗链后我们博客的图片怎么办?
- 最有效的临时解决办法
还是照着笛声博客的风格,先来一个最简单的方法。那就是在网站配置文件里面加一行配置:add_header Referrer-Policy “no-referrer”; 这条配置的意思是将整个 Referer 首部移除。访问来源信息不随着请求一起发送。总之就是让新浪那边认为,这张图片我是直接输入完整的图片地址打开的,而不是从他人的网站引用打开的。
server { listen 443 http2 fastopen=3 reuseport; server_name hqidi.com www.hqidi.com; root /www/blog; add_header Referrer-Policy "no-referrer";
另一种方法就是在主题文件 header.php 文件中添加相关代码,不过这终究不是长久之计,refarrer 相关的功能都失效了,有点饮鸩止渴的意思,我们还是得另辟蹊径。
- 最有效的解决办法
我们还是以尽量简单的方法来搞定这个问题。首先我们要把网站中所有放在新浪图床上的图片都找出来,然后下载到我们的网站服务器上。
找出所有新浪图床上的照片
如果你是打开你网站的每一个页面,然后一个个去找的话,请打开窗户,确认下面没人,然后把电脑丢下去。笛声这里提供一个非常快速的方法找出所有新浪图床上的图片,我们先来看看新浪图床图片 URL 的特点:
http://ws1.sinaimg.cn/large/006tKfTcgy1g12lp87my3j30ow0780sz.jpg https://ws2.sinaimg.cn/large/0072Lfvtly1fymh07hzkkj30dq0dqagc.png https://ws3.sinaimg.cn/large/006tNc79gy1g2cj78h6x5j31gf0itwhj.gif https://ws4.sinaimg.cn/large/0072Lfvtly1fzmelgwrkkj30el09taag.jpg
我们需要一个正则表达式把上面的链接都匹配出来
最前面的协议有两种情况 http 和 https,所以我们用 https?来匹配(问号表示前面的‘s’要么出现 0 次,要么出现 1 次)
后面的 ws 开头的主机好像有 4 台,然后我就算他 10 台,所以对应的正则为 ws[0-9]
‘/large/491ea66cgy1g26kbwkrgpj22001hs7wh’这一段杂七杂八的用[a-Z0-9/]+?来匹配,‘[a-Z0-9/]’这里表示不管你是字母还是数字,还是/都给你匹配上,后面的+表示前面的数字、字母会出现一次或者多次,最后的问号是用来防止过渡匹配的,在这不加问号也没问题。
最后面的图片格式用.(jpg|png|gif)来匹配。
最终的正则表达式为
https?://ws[0-9].sinaimg.cn[a-Z0-9/]+?.(jpg|png|gif)
当然,如果你的网站数据库非常大的话,你需要把这条正则写的尽量的精确,免得半天都跑不出来结果,比方说你全站 https 就可以这样写:
https://ws[1-4].sinaimg.cn/large/[a-Z0-9/]+?.(jpg|png|gif)
正则有了,我们现在去网站的数据库文件里面把所有新浪图床上的图片捞出来,执行下面的命令,最后的 190425.sql 是网站数据库备份文件。
grep -Eo 'https?://ws[0-9].sinaimg.cn[a-Z0-9/]+?.(jpg|png|gif)' 190425.sql
新浪图床图片本地化
刚刚我们把所有新浪图床上图片 URL 全都找了出来,我们现在用一个 for 循环把新浪上的图片全下载下来,建议在网站根目录新建一个 large 目录,把你网站数据库备份文件 190425.sql 也放到这里,然后把图片全下载到这里,在 large 目录里面执行:
for i in `grep -Eo 'https?://ws[0-9].sinaimg.cn[a-Z0-9/]+?.(jpg|png|gif)' 190425.sql`;do wget $i;done
此时,你已经把所有新浪图床上的图片都下载到服务器上,你只要修改下链接就行了。
现在要动数据库了,一定得先备份数据库,一定得先备份数据库,一定得先备份数据库,然后动手。
登录进 MySQL,use 切换到你网站数据库,然后执行下面命令:
UPDATE wp_posts SET post_content = REPLACE( post_content, 'ws1.sinaimg.cn', 'hqidi.com'); UPDATE wp_posts SET post_content = REPLACE( post_content, 'ws2.sinaimg.cn', 'hqidi.com'); UPDATE wp_posts SET post_content = REPLACE( post_content, 'ws3.sinaimg.cn', 'hqidi.com'); UPDATE wp_posts SET post_content = REPLACE( post_content, 'ws4.sinaimg.cn', 'hqidi.com');
注意自行替换最后面的“hqidi.com”,此时,大功告成,新浪图床图片本地化完成,记得一定要把 large 目录里面的数据库备份文件删除。