背景
之前博客的图片是使用的又拍云作为主图床,但是经常性看到有人CDN被刷,损失惨重,所以转念想使用GitHub托管图床+jsDelivr作为免费CDN加速访问。
需求分析
最开始的图床是在服务器上部署了OLAINDEX索引OneDrive,使用非常方便,所有图片均在本地有备份,数据在自己手里的感觉还是很安全的,当时的版本号是4.0,上传图片后,链接格式为https://img.example.com/view/xxxx/head.jpg
,这种格式也非常整齐,所有博客图片也采用这种格式书写,同时使用OLAINDEX的话,图床的速度很不理想,所以将OLAINDEX作为备份图床,采用又拍云作为图床首选方案,所以在又拍云上传时,为了避免大批量的修改博客中的图床链接,沿用了这种格式。
当时采取的方案是先上传到OLAINDEX,然后使用又拍云的CLI工具upx.exe
,使用如下脚本批量上传到又拍云。
.\upx.exe img-zhuomu user password |
后来升级5.0后,OLAINDEX开始支持多账号登录,于是图片链接格式变为了https://img.example.com/hashid/view/xxxx/head.jpg
,多加了一级用以区别账号,给我造成了很大的困扰,每次写插入图片链接时都需要删除一级目录。遂逐渐弃用。
首先需要明白jsDelivr是如何给GitHub做CDN的。
比如一个repository:https://github.com/test/img
,只需要按照如下规则修改前缀即可。
// load any GitHub release, commit, or branch |
访问这个https://cdn.jsdelivr.net/gh/test/img/
路径,可以直接获得目录的列表。
所以我的url中,/view
部分是多余的,我最终要实现的效果是https://img.example.com/hashid/view/xxxx/head.jpg
->https://cdn.jsdelivr.net/gh/test/img/xxxx/head.jpg
,通过查阅资料,发现使用显性URL跳转就可以实现这样的操作。
何为显性转发,何为隐性转发
隐性转发:用的是 iframe 框架技术、非重定向技术,效果为浏览器地址栏输入 http://a.com
回车,打开网站内容是目标地址 http://cloud.tencent.com/
的网站内容,但地址栏显示当前地址 http://a.com
。
显性转发:用的是301重定向技术,效果为浏览器地址栏输入 http://a.com
回车,打开网站内容是目标地址 http://cloud.tencent.com/
的网站内容,且地址栏显示目标地址 http://cloud.tencent.com/
。
转发可以使用DNS进行解析,但是需要域名备案,也可以使用nginx做重定向,本文使用nginx作重定向。
迁移
由于需要对nginx操作,使用宝塔面板较为简单方便。
宝塔准备
网站
->添加站点
->输入域名img.example.com:8899
由于我在服务器上部署了多个web页面,就不使用80端口,采用非80端口 Nginx URL重定向。
下边保持默认,PHP版本选择纯静态
站点添加成功后,选择配置文件
写入下列配置文件
server { |
这里的正则匹配我写了两个,因为历史原因,需要规避/view
这样的目录链接,所以写了两种。
rewrite有三个参数:
- <regex>,用于匹配URI的正则表达式
- <replacement>,将regex正则匹配到的内容替换成 replacement
- [flag],flag标记
flag标记说明:
- last //本条规则匹配完成后,继续向下匹配新的location URI规则
- break //本条规则匹配完成即终止,不再匹配后面的任何规则
- redirect //返回302临时重定向,浏览器地址会显示跳转后的URL地址
- permanent //返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
其中redirect和permanent的区别好像是会影响SEO,具体可以自行查阅相关资料。
另外,SSL可以不配置,这里仅仅做跳转,真正访问数据还是要请求到jsDelivr的CDN上去。
DNS解析
DNS解析到服务器,届时,访问自己的域名即可。
未来
以后可以直接使用PicGo来进行上传,更加方便。关于PicGo的配置,可以参考PicGo的官方文档
我为什么要使用自己的域名?
当然是害怕某天jsDelivr不让白嫖啦,到时候自己直接搭一个图床就可以马上图片访问。
参考资料
正则部分参考链接: