存储桶的虚拟托管 - Amazon Simple Storage Service

存储桶的虚拟托管

虚拟托管是指从单个 Web 服务器为多个网站提供服务的做法。区分站点的一种方法是通过使用请求的显式主机名,而不只是 URI 的路径名称部分。普通的 Amazon S3 REST 请求使用“请求-URI”路径的第一个斜杠分隔部分指定存储桶。或者,您可以通过使用 HTTP Host 标头,在 REST API 调用中使用 Amazon S3 虚拟托管对存储桶进行寻址。在实践中,Amazon S3 将 Host 解释为可在 https://bucketname.s3.Region.amazonaws.com 上自动访问大多数存储桶(对于有限类型的请求)。有关 Amazon S3 区域和终端节点的列表,请参阅 AWS 一般参考 中的 Amazon S3 区域和终端节点

虚拟托管还有其他好处。通过使用注册域名来命名您的存储桶,并将该名称设为 Amazon S3 的 DNS 别名,您可以完全自定义 Amazon S3 资源的 URL,例如:https://my.bucketname.com/。您还可以发布到存储桶的虚拟服务器的“根目录”。此功能很重要,因为许多现有应用程序在此标准位置搜索文件。例如,favicon.icorobots.txtcrossdomain.xml 都应在根目录下。

路径类型请求

目前,Amazon S3 支持所有区域中的虚拟托管式和路径式访问,但这一点将发生改变(请参阅以下重要说明。)

在 Amazon S3 中,路径样式 URL 遵循如下所示格式。

https://s3.Region.amazonaws.com/bucket-name/key name

例如,如果您在 美国西部(俄勒冈) 区域中创建一个名为 mybucket 的存储桶,并希望访问该存储桶中的 puppy.jpg 对象,则可使用以下路径样式 URL:

https://s3.us-west-2.amazonaws.com/mybucket/puppy.jpg
重要

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

虚拟托管类型请求

在虚拟托管类型 URL 中,存储桶名称是 URL 中域名的一部分。

Amazon S3 虚拟托管样式 URL 遵循如下所示格式。

https://bucket-name.s3.Region.amazonaws.com/key name

在此示例中,my-bucket 为存储桶名称,美国西部(俄勒冈)为区域,puppy.png 为密钥名称:

https://my-bucket.s3.us-west-2.amazonaws.com/puppy.png

HTTP 主机标头存储桶规范

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

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

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

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

示例

本节提供示例 URL 和请求。

例 路径类型

此示例使用以下内容:

  • 存储桶名称 ‐ awsexamplebucket1.net

  • 区域 ‐ 美国东部(弗吉尼亚北部)

  • 密钥名称 ‐ homepage.html

URL 如下:

https://s3.us-east-1.amazonaws.com/awsexamplebucket1.net/homepage.html

请求如下:

GET /awsexamplebucket1.net/homepage.html HTTP/1.1 Host: s3.us-east-1.amazonaws.com

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

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

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

例 虚拟托管类型

此示例使用以下内容:

  • 存储桶名称 ‐ awsexamplebucket1.eu

  • 区域 ‐ 欧洲(爱尔兰)

  • 密钥名称 ‐ homepage.html

URL 如下:

https://awsexamplebucket1.eu.s3.eu-west-1.amazonaws.com/homepage.html

请求如下:

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

例 别名记录方法

要使用此方法,您必须配置 DNS 名称作为 bucketname.s3.us-east-1.amazonaws.com 的 CNAME 别名。有关更多信息,请参阅使用 CNAME 自定义 Amazon S3 URL。此示例使用以下内容:

  • 存储桶名称 ‐ awsexamplebucket1.net

  • 密钥名称 ‐ homepage.html

URL 如下:

https://www.awsexamplebucket1.net/homepage.html

示例如下:

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

使用 CNAME 自定义 Amazon S3 URL

根据您的需要,您可能不希望 s3.Region.amazonaws.com 显示在网站或服务中。例如,如果您在 Amazon S3 上托管网站映像,您可能会首选 https://images.awsexamplebucket1.net/,而不是 https://awsexamplebucket1-images.s3.us-east-1.amazonaws.com/。具有 DNS 兼容名称的任何存储桶都可按以下方式引用: https://BucketName.s3.Region.amazonaws.com/[Filename],例如 https://images.awsexamplebucket1.net.s3.us-east-1.amazonaws.com/mydog.jpg。通过使用 CNAME,您可以将 images.awsexamplebucket1.net 映射到 Amazon S3 主机名,以使上一个 URL 能够变为 https://images.awsexamplebucket1.net/mydog.jpg

存储桶名称必须与 CNAME 相同。例如,如果您创建一个 CNAME 以将 images.awsexamplebucket1.net 映射到 images.awsexamplebucket1.net.s3.amazonaws.com,则 https://images.awsexamplebucket1.net/filenamehttps://images.awsexamplebucket1.net.s3.us-east-1.amazonaws.com/filename 两者将相同。

CNAME DNS 记录应将您的域名别名设置为适当的虚拟托管类型主机名。例如,如果存储桶名称和域名是 images.awsexamplebucket1.net 而存储桶位于美国东部(弗吉尼亚北部)区域中,则 CNAME 记录应为 images.awsexamplebucket1.net.s3.us-east-1.amazonaws.com

images.awsexamplebucket1.net CNAME images.awsexamplebucket1.net.s3.us-east-1.amazonaws.com.

Amazon S3 使用主机名来确定存储桶名称。所以 CNAME 和存储桶名称必须相同。例如,假定您配置了 www.example.com 作为 www.example.com.s3.us-east-1.amazonaws.com 的别名记录。当您访问 https://www.example.com 时,Amazon S3 收到如下所示的请求:

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

Amazon S3 仅查看原始主机名 www.example.com 且不知道用于解决请求的 CNAME 映射。

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

使用 CNAME 将主机名与 Amazon S3 存储桶关联

  1. 选择属于您控制的域的主机名。

    本示例使用 images 域的 awsexamplebucket1.net 子域。

  2. 创建与主机名匹配的存储桶。

    在本示例中,主机名和存储桶名称是 images.awsexamplebucket1.net。存储桶名称必须与主机名精确 匹配。

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

    例如:

    images.awsexamplebucket1.net CNAME images.awsexamplebucket1.net.s3.us-west-2.amazonaws.com

    重要

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

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

限制

SSL

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

SOAP

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

向后兼容

传统终端节点

某些区域支持传统终端节点。您可能会在服务器访问日志或 CloudTrail 日志中看到这些终端节点。有关更多信息,请查看以下信息。有关 Amazon S3 区域和终端节点的列表,请参阅 AWS 一般参考 中的 Amazon S3 区域和终端节点

重要

尽管您可能会在日志中看到传统终端节点,但我们建议您始终使用标准终端节点语法访问存储桶。

Amazon S3 虚拟托管样式 URL 遵循如下所示格式。

https://bucket-name.s3.Region.amazonaws.com/key name

在 Amazon S3 中,路径样式 URL 遵循如下所示格式。

https://s3.Region.amazonaws.com/bucket-name/key name

s3‐区域

一些较旧的 Amazon S3 区域支持在 S3 和区域之间包含短划线(例如,S3‐us-west-2)而不是点(例如,S3.us-west-2)的终端节点。如果您的存储桶位于这些区域之一,您可能会在服务器访问日志或 CloudTrail 日志中看到以下终端节点格式:

https://bucket-name.s3-Region.amazonaws.com

在此示例中,存储桶名称为 my-bucket ,区域为 美国西部(俄勒冈):

https://my-bucket.s3-us-west-2.amazonaws.com

传统全局终端节点

对于某些区域,传统全局终端节点可用于构建未指定特定于区域的终端节点的请求。传统全局终端节点如下所示:

bucket-name.s3.amazonaws.com

在服务器访问日志或 CloudTrail 日志中,您可能会看到使用传统全局终端节点的请求。在此示例中,存储桶名称为 my-bucket,并显示传统全局终端节点:

https://my-bucket.amazonaws.com

美国东部(弗吉尼亚北部)的虚拟托管类型请求

默认情况下,使用传统全局终端节点发出的请求会转到美国东部(弗吉尼亚北部)。因此,传统全局终端节点有时用于替代美国东部(弗吉尼亚北部)的区域终端节点。如果您在美国东部(弗吉尼亚北部)中创建存储桶并使用全局终端节点,则默认情况下,Amazon S3 将您的请求路由到此区域。

其他区域的虚拟托管类型请求

传统全局终端节点也用于其他受支持的区域中的虚拟托管类型请求。当您在 2019 年 3 月 20 日之前发布的区域中创建存储桶并使用传统全局终端节点时,Amazon S3 将更新 DNS 以将请求重新路由到正确的位置,这可能会花费一些时间。同时,将应用默认规则,您的虚拟托管类型请求也会进入美国东部(弗吉尼亚北部)区域。然后,Amazon S3 将使用“HTTP 307 重定向”将其重定向到正确的区域。对于在 2019 年 3 月 20 日之后发布的区域中的 S3 存储桶,DNS 不会将您的请求直接路由到您的存储桶所在的 AWS 区域。它而是会返回 HTTP 400 错误请求错误。有关更多信息,请参阅请求重定向和 REST API

路径类型请求

对于美国东部(弗吉尼亚北部)区域,传统全局终端节点可用于路径类型请求。

对于所有其他区域,路径类型语法要求您在尝试访问存储桶时使用特定于区域的终端节点。如果您尝试访问具有传统全局终端节点的存储桶或与存储桶所在区域的终端节点不同的其他终端节点,您将收到 HTTP 响应代码“307 临时重定向”错误和一条消息,指示您资源的正确 URI。例如,如果您将 https://s3.amazonaws.com/bucket-name 用于在美国西部(俄勒冈)区域创建的存储桶,您将收到“HTTP 307 临时重定向”错误。