之前写过一个Amazon AWS S3上通过CNAME,使用自有域名访问的文章,今天在使用阿里云OSS的时候遇到了类似问题,使用aliyun自己的URL可以访问到OSS的资源,一旦通过CNAME到自己的域名之后访问返回400错误。
具体情况如下:
curl -I http://img-sudops.oss-cn-beijing.aliyuncs.com/5801113fb80e7becbb90b8e62d2eb9389b506b6b_small.jpg HTTP/1.1 200 OK Date: Wed, 17 Sep 2014 09:36:47 GMT Content-Type: application/octet-stream Content-Length: 3723 Connection: close Accept-Ranges: bytes ETag: "EFE63D05FC6180901470D2A348BE02CD" Last-Modified: Wed, 17 Sep 2014 08:10:02 GMT Server: AliyunOSS x-oss-request-id: 5419562FF150B97C63261B00 curl -I http://img.sudops.com/5801113fb80e7becbb90b8e62d2eb9389b506b6b_small.jpg HTTP/1.1 400 Bad Request Date: Wed, 17 Sep 2014 09:43:34 GMT Content-Type: application/xml Content-Length: 307 Connection: close Server: AliyunOSS x-oss-request-id: 541957C60C0F577E6126998F
使用浏览器直接访问http://img.sudops.com/5801113fb80e7becbb90b8e62d2eb9389b506b6b_small.jpg的错误提示:
<Error> <Code>InvalidBucketName</Code> <Message>The specified bucket is not valid.</Message> <BucketName>5801113fb80e7becbb90b8e62d2eb9389b506b6b_small.jpg</BucketName> <RequestId>54199F754AA4F1BB76B7A3A4</RequestId> <HostId>img.sudops.com</HostId> </Error>
按照之前使用AWS S3处理过的类似经验,本以为使用域名作为bucket就可以解决了,其实并不然,阿里云OSS的bucket命名规则不支持带.的,域名方式肯定是不行了,google了半天没有找到答案,最后还是仔细读了一下阿里云OSS的文档才发现如下:
3.4 自定义域名绑定(CNAME) OSS支持用户将自定义的域名绑定在属于自己的bucket上面,这个操作必须通过OSS控制台(http://oss.aliyun.com)来实现。按照中国《互联网管理条例》的要求,所有需要开通这项功能的用户,必须提供阿里云备案号,域名持有者身份证等有效资料,经由阿里云审批通过后才可以使用。在开通CNAME功能后,OSS将自动处理对该域名的访问请求。 CNAME应用场景例子: Ø 用户A拥有一个域名为abc.com的网站;这个网站的所有图片存储在img.abc.com这个子域名下; Ø 为了应对日益增长的图片流量压力,用户A在OSS上创建了一个名为abc-img的bucket,并将所有图片存在OSS上; Ø 通过OSS控制台,提交将img.abc.com CNAME成 abc-img.oss.aliyuncs.com的申请,并提供相应的材料 Ø 通过阿里云审核后,在自己的域名服务器上,添加一条CNAME规则,将img.abc.com映射成abc-img.oss.aliyuncs.com,这样所有对img.abc.com的访问都将变成访问abc-img这个bucket。例如:一个对http://img.abc.com/logo.png的访问,实际上访问的是http://abc-img.oss.aliyuncs.com/logo.png。
原来阿里云OSS上面如使用自己的域名需要通过“审批”才能正常使用,我擦,阿里这朵云果然有天朝特色,真乃云中奇葩!
Pingback: 阿里云ECS上安装Nginx及反向代理配置 | 南城旧少年