上一篇文章讲到了为何要迁移到阿里OSS,经过几天时间的实际验证,发现还是踩了不少的坑,这里记录下,供参考。
首先有几个先决条件如下:
- 全站所有请求必须HTTPS
- 全站仅允许出现自有二级域名
- 上行和下行流量均不经过ECS服务器
(代码洁癖 )
阿里OSS我们可以简单的认为分两个部分:
一是存储有关的,提供了两个访问域名:一个是公网,一个内网
<bucket>.oss-cn-shenzhen.aliyuncs.com (A域名)
<bucket>.oss-cn-shenzhen-internal.aliyuncs.com (B域名)
二是为图像处理(缩图,转码)有关的,也提供了一个访问域名:
<bucket>.img-cn-shenzhen.aliyuncs.com (C域名)
我们在这个图像处理的功能上面绑定了一个自有的二级域名:
image.snapast.com (D域名)
默认分配并指向了下面的CDN加速节点域名:
image.snapast.com.w.kunlunca.com (E域名)
暂且称为A~E域名,注意其中细微差别。其中A和B域名本身是支持HTTPS的,但C不行,在绑定了D之后,可以上传SSL证书开启。A域名也可以绑定自有域名,但不支持HTTPS。图像处理设置了禁止原图访问,也就是C,D域名仅允许通过“样式”访问到缩略图。但A,B不受限制,本来就不同的系统。
于是第一个方案是这样的:
用户上传:HTTPS POST A域名
用户访问:HTTPS GET D域名
初看没啥问题,除了引入一个第三方域名,不符合预定规范,但也运行良好,但有个很严重的问题,会泄漏原图,将D域名的路径拼接到A上面就能拿到原图。故pass掉,和客服聊了后给了个鸡贼的方案:
方案二:
用户上传:HTTPS POST upload.snapast.com -> proxy_pass -> B域名
用户访问:HTTPS GET D域名
在nginx上将用户上行的POST请求转发到B域名,这样可以在nginx层面拦截原图访问,并可以支持自有域名HTTPS。虽然又点不符合规范了,虽然ECS下行带宽还是蛮大的,proxy_pass也是内网地址,似乎也无大碍。
方案三:
将bucket设置为私有,这样POST不变,GET需要增加signature,想想就复杂,搞的URL又长又丑,没再尝试。
后来想想,能不能直接POST到D域名试试,居然成功了。Object 管理中证实了文件是传成功的,但感觉怪怪的,原来CDN还能upload。官方文档似乎也没有说这样用合不合理,暂且先如此把。