过年花了5个小时,把我的所有BLOG(200多篇)检查了一遍,更正了几十处图片链接失效。
1. 现象
几个月来,由于在写书,不停地回翻自己以前的文章。结果,不断发现大量辛辛苦苦绘制的图片打不开了,Markdown变成了下面的文字,这类Markdown 类似:
[外链图片转储失败,源站可能有防盗链机制,建议将图片保存下来直接上传(imgXXXXXXX)(https://img-blog.csdn.net/20180401221914791?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2dvbGRlbmhhd2tpbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)]
请注意我的图片不是外链,是我自己上传到CSDN上去的图片。请看链接里就是CSDN的域名。我觉得应该有很多文章都受到了影响。肯定不止我一个人。CSDN应该因此损失了很多优秀的内容,作为认真写作的个人,也非常苦恼。
解决方法,是直接把网址复制出来,重新用Markdown语法写一遍:
![imgXXXXXXX](https://img-blog.csdn.net/20180401221914791)
幸好,所有图片其实都存在img-blog.csdn.net上,只是Markdown的文字被改废了。如果文件丢失,我就要疯了。要知道,有的图片是我用画图花了一上午绘制的,有的是半夜爆肝绘制的。而且,自己没有备份。
2.直接原因
直接原因是改变我博文的自动脚本读取不到图片。这种事故,应该是因为CSDN某次调整,要给全站的没有加水印的图片,加上CSDN的水印。结果,弄巧成拙,搞出了错误来了。
一般来说,要把没有加水印的图片加水印,有两种方法。一个是上传后立刻加水印,物理改变原始图片。另一个,是做成webService,在输送图片时,在线加。显然,根据URL来看,CSDN是第二种。在以前,很多Markdown里的图片,都没有水印。为了批量处理,就做了一个程序,搜索图片并添加。
为了正确读取图片的大小,我想自动添加水印的脚本应该会去直接访问这个图片。结果,却无法访问到,触发了异常。而后,替换器就认为这个网址是外链。我想,替换器直接采用了Markdown写作编辑器粘贴的代码,对这个异常做出了过激的响应,直接把原文改了。
3. 根本原因
3.1 没有遵循惰性法则
万不该因为一次链接不可访问,而替换原文本身。这一点如果遵守,应该可以避免失误。哪怕替换了,也应该留个备份。
3.2 缺少预判与测试
至少有以下原因,可能导致批处理访问CSDN自己的图片也失败:
- 正则表达式失误。鉴于不是所有图片都出故障,我猜是Markdown图片的替换字(【】内的文字)中的某些字符,恰好与用于匹配的RegExp碰撞了,导致程序提取到的Url不是完整而正确的网址,导致下载失败。
- 证书错误。由于CSDN是https的,如果在CSDN站内用局部域名或者IP地址替换URL,则会遇到证书SSL认证失败,Host 域名和证书不一致。当然这个太Low,基本不可能出现。
- 内网回环。在站内局域网内,使用域名反映的公网IP访问自己,需要进行内网回环。如果没有配置好,在站内的主机上,是访问不到外部的域名地址的。当然这个太Low,基本不可能出现。
- 符号失配。脚本生成URL时,/, " 等字符没有配对。导致URL失效。
但这些问题应该都能够预判和通过局部测试解决。如果是笔者操作一个拥有海量知识文章的大型数据池,而我有权限进行替换、删除,我会非常慌:慌的手都发抖。分享知识和经验,共享代码是善良、伟大、可贵的,要尊重与善待每一次分享。