Amazon Simple Storage Service
开发人员指南 (API Version 2006-03-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

存储桶的虚拟托管

一般而言,虚拟托管是指从单个 Web 服务器为多个 Web 站点提供服务的做法。区分站点的一种方法是通过使用请求的显式主机名,而不只是 URI 的路径名称部分。普通的 Amazon S3 REST 请求使用“请求-URI”路径的第一个斜杠分隔部分指定存储桶。或者,您可以通过使用 HTTP Host 标头,在 REST API 调用中使用 Amazon S3 虚拟托管对存储桶进行寻址。事实上,Amazon S3 会将 Host 解释为可在 http://bucketname.s3.amazonaws.com 上自动访问大多数存储段 (对于有限类型的请求)。此外,通过使用注册域名来命名您的存储桶,并将该名称设为 Amazon S3 的 DNS 别名,您可以完全自定义 Amazon S3 资源的 URL,例如:http://my.bucketname.com/

除了自定义 URL 的好处外,虚拟托管的另一个好处是能够发布到存储桶的虚拟服务器的“根目录”。此功能很重要,因为许多现有应用程序在此标准位置搜索文件。例如,favicon.icorobots.txtcrossdomain.xml 都应在根目录下。

重要

Amazon S3 支持在所有区域进行虚拟托管式和路径式访问。但是,路径式语法要求您在尝试访问存储段时必须使用特定于地区的终端节点。例如,如果您有一个位于 欧洲(爱尔兰) 区域的名为 mybucket 的存储桶,您希望使用路径式语法并且对象名为 puppy.jpg,则正确的 URI 为 http://s3-eu-west-1.amazonaws.com/mybucket/puppy.jpg

您将收到一个“HTTP 响应代码 307 临时重定向”错误和一条消息,该消息指出当您尝试使用含有以下一种内容的路径式语法来访问美国东部 (弗吉尼亚北部) 区域之外的存储桶时,正确的资源 URI 为:

  • http://s3.amazonaws.com

  • 区域的终端节点不同于存储桶所在的终端节点。例如,对在 美国西部(加利福尼亚北部) 区域创建的存储桶使用 http://s3-eu-west-1.amazonaws.com

注意

如果您使用美国东部 (弗吉尼亚北部) 终端节点 (s3.amazonaws.com),而不是区域特定的终端节点 (例如 s3-eu-west-1),则在默认情况下 Amazon S3 会将任何虚拟托管式请求路由到美国东部 (弗吉尼亚北部) 区域。amazonaws.com)。当您在任何区域创建存储桶时,Amazon S3 都将更新 DNS 以将请求重新路由到正确的位置,这可能会花费一些时间。同时,将应用默认规则,您的虚拟托管式请求也会进入美国东部 (弗吉尼亚北部) 区域,Amazon S3 将使用 HTTP 307 redirect 将其重定向到正确的区域。有关更多信息,请参阅 请求重定向和 REST API

当通过 SSL 使用虚拟托管式存储桶时,SSL 通配符证书仅匹配不包含句点的存储桶。要解决此问题,请使用 HTTP 或编写自己的证书验证逻辑。

HTTP 主机标头存储桶规范

只要您的 GET 请求不使用 SSL 终端节点,您就可以通过使用 HTTP Host 标头为请求指定存储桶。REST 请求中的 Host 标头解释如下:

  • 如果 Host 标头被省略,或其值为“s3.amazonaws.com”,则该请求的存储段将成为“Request-URI”的第一个斜杠分隔的部分,而且该请求的键值将成为“Request-URI”的其余部分。这是常用方法,如本节第一个和第二个示例所示。省略主机标头仅对于 HTTP 1.0 请求有效。

  • 否则,如果 Host 标头的值以“.s3.amazonaws.com”结尾,则存储桶名称是 Host 标头值中从开头到“.s3.amazonaws.com”的部分。该请求的键值为“Request-URI”。此解释将存储桶公开为 s3.amazonaws.com 的子域,如本节第三和第四个示例所示。

  • 否则,请求的存储桶是 Host 标头的小写值,请求的键值是“Request-URI”。如果注册的 DNS 名称与存储桶名称相同,并且已将该名称配置为 Amazon S3 的别名记录 (CNAME) 别名,则此解释很有用。注册域名和配置 DNS 的过程不在本指南的范围内,但本节中的最后一个示例展示了结果。

示例

本节提供示例 URL 和请求。

例 路径类型的方法

本示例使用 johnsmith.net 作为存储段名称,使用 homepage.html 作为密钥名称。

URL 如下:

Copy
http://s3.amazonaws.com/johnsmith.net/homepage.html

请求如下:

Copy
GET /johnsmith.net/homepage.html HTTP/1.1 Host: s3.amazonaws.com

具有 HTTP 1.0 且省略 host 标头的请求如下:

Copy
GET /johnsmith.net/homepage.html HTTP/1.0

有关 DNS 兼容名称的信息,请参阅限制。有关键值的更多信息,请参阅键值

例 虚拟托管式方法

本示例使用 johnsmith.net 作为存储段名称,使用 homepage.html 作为密钥名称。

URL 如下:

Copy
http://johnsmith.net.s3.amazonaws.com/homepage.html

请求如下:

Copy
GET /homepage.html HTTP/1.1 Host: johnsmith.net.s3.amazonaws.com

虚拟托管式方法要求存储桶名称符合 DNS 要求。

例 针对非美国东部 (弗吉尼亚北部) 区域内的存储桶的虚拟托管式方法

本示例使用 johnsmith.eu 作为 欧洲(爱尔兰) 区域中存储桶的名称,并使用 homepage.html 作为键名称。

URL 如下:

Copy
http://johnsmith.eu.s3-eu-west-1.amazonaws.com/homepage.html

请求如下:

Copy
GET /homepage.html HTTP/1.1 Host: johnsmith.eu.s3-eu-west-1.amazonaws.com

注意,无论存储桶位于哪个区域,您都可使用美国东部 (弗吉尼亚北部) 区域终端节点替代区域特定的终端节点。

Copy
http://johnsmith.eu.s3.amazonaws.com/homepage.html

请求如下:

Copy
GET /homepage.html HTTP/1.1 Host: johnsmith.eu.s3.amazonaws.com

例 别名记录方法

本示例使用 www.johnsmith.net 作为存储段名称,使用 homepage.html 作为密钥名称。要使用此方法,您必须配置 DNS 名称作为 bucketname.s3.amazonaws.com 的别名记录别名。

URL 如下:

Copy
http://www.johnsmith.net/homepage.html

示例如下:

Copy
GET /homepage.html HTTP/1.1 Host: www.johnsmith.net

使用别名记录自定义 Amazon S3 URL

根据您的需要,您可能不希望“s3.amazonaws.com”显示在网站或服务中。例如,如果在 Amazon S3 上托管网站映像,您可能会首选 http://images.johnsmith.net/,而不是 http://johnsmith-images.s3.amazonaws.com/.

存储段名称必须与 CNAME 相同。因此,如果创建了别名记录,以便将 http://images.johnsmith.net/filename 映射到 http://images.johnsmith.net.s3.amazonaws.com/filename,则 images.johnsmith.net 将与 images.johnsmith.net.s3.amazonaws.com 相同。

具有 DNS 兼容名称的任何存储桶都可按以下方式引用: http://[BucketName].s3.amazonaws.com/[Filename],例如 http://images.johnsmith.net.s3.amazonaws.com/mydog.jpg。通过使用别名记录,可将 images.johnsmith.net 映射到 Amazon S3 主机名,因此上述 URL 可以变为 http://images.johnsmith.net/mydog.jpg

别名记录 DNS 记录应将您的域名别名设置为适当的虚拟托管式主机名。例如,如果存储桶名称和域名是 images.johnsmith.net,则别名记录应将别名设置为 images.johnsmith.net.s3.amazonaws.com.

Copy
images.johnsmith.net CNAME images.johnsmith.net.s3.amazonaws.com.

也可以针对 s3.amazonaws.com 设置别名,但可能导致额外的 HTTP 重定向。

Amazon S3 使用主机名来确定存储桶名称。例如,假定您配置了 www.example.com 作为 www.example.com.s3.amazonaws.com 的别名记录。当您访问 http://www.example.com 时,Amazon S3 会收到如下所示的请求:

Copy
GET / HTTP/1.1 Host: www.example.com Date: date Authorization: signatureValue

因为 Amazon S3 仅看到原始主机名 www.example.com,不知道用于解析请求的别名记录映射,所以别名记录和存储桶名称必须相同。

可在别名记录中使用任何 Amazon S3 终端节点。例如,s3-ap-southeast-1.amazonaws.com 可用于 CNAME 中。有关终端节点的更多信息,请参阅请求终端节点

使用别名记录将主机名与 Amazon S3 存储桶关联

  1. 选择属于您控制的域的主机名。本示例使用 images 域的 johnsmith.net 子域。

  2. 创建与主机名匹配的存储桶。在本示例中,主机名和存储桶名称是 images.johnsmith.net

    注意

    存储桶名称必须与主机名精确匹配。

  3. 创建一条 CNAME 记录,它定义主机名作为 Amazon S3 存储桶的别名。例如:

    images.johnsmith.net CNAME images.johnsmith.net.s3.amazonaws.com

    重要

    出于请求路由原因,别名记录必须严格按照上述示例所示进行定义。否则,它可能显示为运行正常,但最终导致不可预测的行为。

    注意

    配置 DNS 的过程取决于您的 DNS 服务器或 DNS 提供商。有关特定信息,请参阅您的服务器文档或与您的供应商联系。

限制

对于非 SSL 请求以及在使用 REST API 时,支持使用 HTTP Host 标头为请求指定存储桶。您无法使用不同的终端节点在 SOAP 中指定存储桶。

注意

HTTP 上的 SOAP 支持已弃用,但是仍可在 HTTPS 上使用。对于 SOAP 将不支持新 Amazon S3 功能。我们建议您使用 REST API 或 AWS 开发工具包。

向后兼容

Amazon S3 的早期版本错误地忽略了 HTTP Host 标头。必须更新依赖此未记录行为的应用程序才能正确设置 Host 标头。因为当 Host 存在时,Amazon S3 将据其确定存储桶名称,所以此问题最有可能的表现是收到意外的 NoSuchBucket 错误结果代码。