文章由我在本地写好,并把所有的资源(图片)跟 index.html 放在同一个目录下。提交到 git 归档,推送到 github 发布。
我的文章的固定链接格式是 https://blog.twofei.com/文章ID/,最后的一个“/”使得伪静态成了目录。文章中我的图片引用格式是:
<img alt src="flower.jpg" />
,这是相对路径,所以,最终的图片URL(本文)是: https://blog.twofei.com/634/flower.jpg。
我的博客同样支持完整的文章链接,比如本文的链接是:http://blog.twofei.com/bloglog/base.html,这不是一个以“/”结尾的链接,无法正确解析到图片的地址,所以我在HTML的HEAD部分加了一个 <base> 标签用来指明页面的根目录,这样资源就能正确定位了。 我觉得 <base> 这个标签超级难用,远不应该只有这么一点功能。然而实际上它确实只一个指定根目录的作用。没办法了。
“https://blog.twofei.com/634/flower.jpg”这个链接中,目录 “/634/”在文件系统中是不存在的,是一个动态链接,在 PHP 代码中重写了:
$rule = ['^/(\d+)(/)?$' => 'short=1&id=$1&slash=$2',];
,这样一来,/634/flower.jpg 也成了一个动态链接,本地文件系统中同样是不存在的,它也被重定向了,是在 nginx 服务器中进行的:
rewrite ^/(\d+)/(.+)$ /files/$1/$2;
,这是一个内部重定向,被重定向到了某云存储上:
location ~ ^/(files)/ { return 302 https://twofei-xxx.oss-cn-hangzhou.aliyuncs.com$uri; }
图片是跟随文章一起推送到 github 上面的,所以上面的某云其实是找不到的,于是我在它的后台设置了“回源设置”。回源设置有两个功能:
-
重定向
如果资源在此服务器上找不到,则直接转到设置的回源地址,不作其它操作;
-
镜像
如果受访资源存在,直接返回;如果不存在,拉取回源设置中指定的回源地址中的该资源并保存到本地,然后再返回;那么,下次请求时,就可以直接返回了。相当于一个自动拷贝的作用。
,我选择的是“镜像”方式,镜像的地址指向了github:
原地址 : https://twofei-xxx.oss-cn-hangzhou.aliyuncs.com/files/resource 回源地址 : https://blog.twofei.com/source/files/resource
,最后再在 nginx 中作了一次重定向(因为上面的回源地址设置与github的目标地址不能一次性设置,所以多了这个步骤):
location ~ ^/source/files/(.+)$ { return 302 https://raw.githubusercontent.com/movsb/posts/master/$1; }
,指向了我的博客版本库中。这是第1次访问(所有人)图片时要作的操作。以后就只会进行一次重定向了,因为已经回源。
于是,一张图片就这样子地被正确索引。