[博客日志] 文章中图片的来源及索引

陪她去流浪 桃子 2016年05月18日 编辑 阅读次数:3404

文章由我在本地写好,并把所有的资源(图片)跟 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 上面的,所以上面的某云其实是找不到的,于是我在它的后台设置了“回源设置”。回源设置有两个功能:

  1. 重定向

    如果资源在此服务器上找不到,则直接转到设置的回源地址,不作其它操作;

  2. 镜像

    如果受访资源存在,直接返回;如果不存在,拉取回源设置中指定的回源地址中的该资源并保存到本地,然后再返回;那么,下次请求时,就可以直接返回了。相当于一个自动拷贝的作用。

,我选择的是“镜像”方式,镜像的地址指向了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次访问(所有人)图片时要作的操作。以后就只会进行一次重定向了,因为已经回源。

于是,一张图片就这样子地被正确索引。

标签:博客日志 · nginx · github