Amazon Simple Storage Service
开发人员指南 (API 版本 2006-03-01)

存储桶的虚拟托管

一般而言,虚拟托管是指从单个 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 response code 307 Temporary Redirect (HTTP 响应代码 307 临时重定向)”错误和一条消息,该消息指出当您尝试使用含有以下一种内容的路径式语法来访问美国东部(弗吉尼亚北部)区域之外的存储桶时,正确的资源 URI 为:

  • http://s3.amazonaws.com

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

重要

在 2020 年 9 月 30 日之后创建的存储桶将仅支持虚拟托管式请求。在此日期或之前创建的存储桶将继续支持路径式请求。有关更多信息,请参阅 Amazon S3 路径弃用计划 - 案例的其余部分

如果您使用美国东部(弗吉尼亚北部)终端节点 (s3.amazonaws.com),而不是区域特定的终端节点(例如,s3-us-west-1.amazonaws.com),则 Amazon S3 默认将任何虚拟托管样式的请求路由到美国东部(弗吉尼亚北部)区域。当您在 2019 年 3 月 20 日之前发布的任何区域中创建存储桶时,Amazon S3 将更新 DNS 以将请求重新路由到正确的位置,这可能会花费一些时间。同时,将应用默认规则,您的虚拟托管式请求也会进入美国东部(弗吉尼亚北部)区域。然后,Amazon S3 将使用 HTTP 307 redirect 将其重定向到正确的区域。

对于在 2019 年 3 月 20 日之后发布的区域中的 S3 存储桶,DNS 不会将您的请求直接路由到您的存储桶所在的 AWS 区域。它而是会返回 HTTP 400 错误请求错误。

有关更多信息,请参阅 请求重定向和 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 如下:

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

请求如下:

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

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

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

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

例 虚拟托管式方法

本示例使用 johnsmith.net 作为存储桶名称,使用 homepage.html 作为键名。

URL 如下:

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

请求如下:

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

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

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

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

URL 如下:

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

请求如下:

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

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

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

请求如下:

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

例 别名记录方法

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

URL 如下:

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

示例如下:

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

使用 CNAME 自定义 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。通过使用 CNAME,您可以将 images.johnsmith.net 映射到 Amazon S3 主机名,以使上一个 URL 能够变为 http://images.johnsmith.net/mydog.jpg

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

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 会收到如下所示的请求:

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

Amazon S3 仅查看原始主机名 www.example.com 且不知道用于解决请求的 CNAME 映射。所以 CNAME 和存储桶名称必须相同。

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

使用 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 (HTTP) 请求支持虚拟主机 URL。

注意

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

向后兼容

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