在使用阿里云 OSS 服务的时候,上传文件之后会生成形如http://bucketname.oss-cn-location.aliyuncs.com/filename的链接用于访问资源,但是这个链接并不便于记忆,有时候我们可能想要用自己的域名来访问,但是如果设置了 CNAME 指向bucketname.oss-cn-location.aliyuncs.com这个域名的话,访问时会报InvalidBucketName错误。这是因为阿里 OSS 通过 HTTP 头字段 (HTTP header fields) 中的Host字段来判断所访问域名再返回相应资源,通过 CNAME 访问时就会无法获取到正确的bucketname而导致访问失败。

还有一种办法就是通过 URL 转发来实现,但是我用的 DNS 服务商 DNSPOD 的显性 URL 服务要经过审核,延迟 24h 才能生效,而且多半无法通过,隐性 URL 服务更是要收费。而显性 URL 服务本质上就是一个 301 重定向,隐形 URL 则是服务端重定向。于是我考虑了一个通过自建服务器进行重定向的方法。

准备工作

本文基于 Ubuntu 进行说明。

首先在自己的服务器上安装nginx,这是一个优秀的 Web 服务器软件:

1
2
$sudo apt-get update
$sudo apt-get install nginx

配置 301 跳转

进入/etc/nginx/sites-enabled/目录

编辑 default文件

将其中server项中改为如下

1
2
3
4
5
6
server {
listen 80;
server_name 你的域名;
if ($host = '你的域名' ) {
rewrite ^/(.*)$ http://你的 OSS 域名/$1 pernament;}
}

以我的域名为例:

1
2
3
4
5
6
server {
listen 80;
server_name oss.zrstea.com;
if ($host = 'oss.zrstea.com' ) {
rewrite ^/(.*)$ http://zrstea.oss-cn-shenzhen.aliyuncs.com/$1 pernament;}
}

pernament 代表 301 永久重定向 (Permanently Moved) ,也可以用 redirect 使用 302 临时重定向 (Temporarily Moved) 。这两种方式对本文场景下的应用来说是没有区别的。但是对搜索引擎来说 302 重定向是不友好的,可能会在权重上有所歧视,一般建议使用 301 重定向。

保存退出,重启 nginx 服务:

$sudo service nginx restart

配置域名 A 记录

将自己的域名的 A 记录配置为服务器的 IP 。

测试

这样访问

http://oss.zrstea.com/ATfiled.jpg

就会自动重定向到

http://zrstea.oss-cn-shenzhen.aliyuncs.com/ATfiled.jpg