Amazon CloudFront
开发人员指南 (API 版本 2016-09-29)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Amazon S3 源的请求和响应行为

CloudFront 如何处理请求以及将请求转发到 Amazon S3 源服务器

本主题包含有关 CloudFront 如何处理查看器请求以及如何将请求转发到 Amazon S3 源的信息。

缓存持续时间和最小 TTL

对于 Web 分配,要控制对象在 CloudFront 缓存中保留多长时间后 CloudFront 将另一请求转发到源,您可以:

  • 配置源,以添加 Cache-ControlExpires 标头字段到每个对象。

  • 在 CloudFront 缓存行为中指定最小 TTL 的值。

  • 使用默认值 24 小时。

有关更多信息,请参阅管理内容保留在边缘缓存中的时间长度(过期)

客户端 IP 地址

如果查看器将请求发送到 CloudFront 并且不包含 X-Forwarded-For 请求标头,CloudFront 将通过 TCP 连接获取查看器的 IP 地址,添加包含该 IP 地址的 X-Forwarded-For 标头,并将请求转发到源。例如,如果 CloudFront 通过 TCP 连接获取 IP 地址 192.0.2.2,则它将以下标头转发到源:

X-Forwarded-For: 192.0.2.2

如果查看器将请求发送到 CloudFront 并且包含 X-Forwarded-For 请求标头,CloudFront 将通过 TCP 连接获取查看器的 IP 地址,将该 IP 地址附加到 X-Forwarded-For 标头的末尾,并将请求转发到源。例如,如果查看器请求包含 X-Forwarded-For: 192.0.2.4,192.0.2.3,并且 CloudFront 通过 TCP 连接获取 IP 地址 192.0.2.2,则它将以下标头转发到源:

X-Forwarded-For: 192.0.2.4,192.0.2.3,192.0.2.2

注意

X-Forwarded-For 标头包含 IPv4 地址(例如 192.0.2.44)和 IPv6 地址(例如 2001:0db8:85a3:0000:0000:8a2e:0370:7334)。

有条件的 GET

在 CloudFront 从边缘缓存收到已过期的对象的请求时,它将请求转发到 Amazon S3 源以获取对象的最新版本,或者从 Amazon S3 获得 CloudFront 边缘缓存已具有最新版本的确认。在 Amazon S3 最初将对象发送到 CloudFront 时,它在响应中包括 ETag 值和 LastModified 值。在 CloudFront 转发到 Amazon S3 的新请求中,CloudFront 添加以下一项或两项内容:

  • If-MatchIf-None-Match 标头,其包括对象过期版本的ETag值。

  • If-Modified-Since 标头,其包含对象过期版本的LastModified值。

Amazon S3 使用该信息确定是否已更新对象,以及是将整个对象返回到 CloudFront,还是仅返回 HTTP 304 状态代码 (Not Modified)。

Cookies

Amazon S3 不处理 Cookie。如果您配置缓存行为以将 Cookie 转发到 Amazon S3 源,CloudFront 将转发 Cookie,但 Amazon S3 忽略它们。同一对象的所有将来请求 (无论您是否更改 Cookie) 都将通过缓存中的现有对象提供。

跨源资源共享 (CORS)

如果您希望 CloudFront 采用 Amazon S3 跨源资源共享设置,请配置 CloudFront 以将选定的标头转发到 Amazon S3。有关更多信息,请参阅根据请求标头缓存内容

包含正文的 GET 请求

如果查看器 GET 请求包含正文,则 CloudFront 将 HTTP 状态代码 403 (Forbidden) 返回到查看器。

HTTP 方法

如果您将 CloudFront 配置为处理其支持的所有 HTTP 方法,则 CloudFront 会接受来自查看器的以下请求,并将这些请求转发到您的 Amazon S3 源:

  • DELETE

  • GET

  • HEAD

  • OPTIONS

  • PATCH

  • POST

  • PUT

CloudFront 始终缓存 GETHEAD 请求的响应。您还可以将 CloudFront 配置为缓存 OPTIONS 请求的响应。CloudFront 不缓存使用其他方法的请求的响应。

如果将 Amazon S3 存储桶作为分配的源并使用 CloudFront 源访问身份,则在某些 Amazon S3 区域中不支持 POST 请求,并且这些区域中的 PUT 请求需要使用额外的标头。有关更多信息,请参阅在仅支持签名版本 4 身份验证的 Amazon S3 区域中使用源访问身份

如果您想使用多部分上传方式来将对象添加到 Amazon S3 存储桶,则必须将 CloudFront 原始访问标识添加到您的分配中,并向原始访问标识授予所需的许可。有关更多信息,请参阅使用源访问身份限制对 Amazon S3 内容的访问

重要

如果您将 CloudFront 配置为接受 CloudFront 支持的所有 HTTP 方法并将这些方法转发到 Amazon S3,则必须创建一个 CloudFront 原始访问标识以限制对 Amazon S3 内容的访问,并为该原始访问标识授予所需的权限。例如,如果由于要使用 PUT 而将 CloudFront 配置为接受并转发这些方法,您必须配置 Amazon S3 存储桶策略或 ACL 以相应地处理 DELETE 请求,以便查看器无法删除您不希望它们删除的资源。有关更多信息,请参阅使用源访问身份限制对 Amazon S3 内容的访问

有关 Amazon S3 支持的操作的信息,请参阅 Amazon S3 文档

CloudFront 删除或更新的 HTTP 请求标头

在将请求转发到 Amazon S3 源之前,CloudFront 将删除或更新一些标头。对于大多数标头,此行为与自定义源的相同。有关 HTTP 请求标头的完整列表以及 CloudFront 如何处理这些标头的信息,请参阅HTTP 请求标头和 CloudFront 行为 (自定义源和 S3 源)

请求的最大长度与 URL 的最大长度

请求的最大长度,包括路径、查询字符串(如果有)以及标头,是 20480 个字节。

CloudFront 根据请求来构造 URL。此 URL 的最大长度是 8192 个字节。

如果请求或 URL 超出这些限制,则 CloudFront 将 HTTP 状态代码 413 (请求标头字段过大) 返回到查看器,然后终止与查看器的 TCP 连接。

OCSP Stapling

当查看器提交对象的 HTTPS 请求时,CloudFront 或查看器必须与证书颁发机构 (CA) 确认尚未吊销域的 SSL 证书。OCSP Stapling 允许 CloudFront 验证证书并缓存来自 CA 的响应,这将使客户端无需直接向 CA 验证证书,从而加快证书验证速度。

当 CloudFront 收到同一域中的对象的大量 HTTPS 请求时,OCSP Stapling 的性能改进会更明显。CloudFront 边缘站点中的每个服务器必须提交一个单独的验证请求。在 CloudFront 收到同一域的大量 HTTPS 请求时,边缘站点中的每个服务器很快将收到来自 CA 的响应,指出它可以在 SSL 握手中“固定”到一个数据包;在查看器认为证书有效时,CloudFront 可以提供请求的对象。如果您的分配未在 CloudFront 边缘站点中产生大量流量,则新请求更有可能定向到尚未向 CA 验证证书的服务器。在这种情况下,查看器将单独执行验证步骤,并且 CloudFront 服务器将提供对象。该 CloudFront 服务器还会向 CA 提交验证请求,因此,在它下次收到包含同一域名的请求时,便已获得来自 CA 的验证响应。

协议

CloudFront 根据查看器请求的协议(HTTP 或 HTTPS),来向源服务器转发 HTTP 或 HTTPS 请求。

重要

如果 Amazon S3 存储桶配置为网站终端节点,则无法将 CloudFront 配置为使用 HTTPS 与源进行通信,因为 Amazon S3 不支持该配置中的 HTTPS 连接。

查询字符串

对于 Web 分配,您可以配置是否让 CloudFront 将查询字符串参数转发到 Amazon S3 源。对于 RTMP 分配,CloudFront 不转发查询字符串参数。有关更多信息,请参阅 根据查询字符串参数缓存内容

源响应超时

源响应超时 (也称为源读取超时或源请求超时) 适用于以下两个值:

  • 在将请求转发到 Amazon S3 后 CloudFront 等待响应的时间长度(以秒为单位)

  • CloudFront 从收到来自 S3 的响应的一个数据包到收到下一个数据包之间等待的时间长度(以秒为单位)

CloudFront 的行为取决于 HTTP 方法:

  • GETHEAD 请求 – 如果 Amazon S3 在 30 秒内未做出响应或停止响应达到 30 秒,CloudFront 将中断连接并额外尝试联系源两次。如果在第三次尝试期间,源未进行回复,CloudFront 将不会重试,直至它收到针对同一 CloudFront 源上的内容的其他请求。

  • DELETEOPTIONSPATCHPUTPOST 请求 – 如果 Amazon S3 在 30 秒内未做出响应,CloudFront 将中断连接并且不会再次尝试以联系源。如有必要,客户端可以重新提交请求。

对于所有请求,CloudFront 将尝试与 S3 建立连接。如果连接在 10 秒内失败,CloudFront 将中断连接并另外尝试联系 S3 两次。如果在第三次尝试期间,源未进行回复,则 CloudFront 将不会重试,直至它收到对同一个源上的内容的其他请求。

S3 的响应超时无法更改。

同一对象的并行请求 (流量高峰)

如果 CloudFront 边缘站点收到对象的请求,并且对象当前没有位于缓存中或对象已过期,则 CloudFront 立即将请求发送到 Amazon S3 源。如果遇到流量高峰(即,在 Amazon S3 响应第一个请求之前,针对同一对象的其他请求到达边缘站点)CloudFront 先短暂中止,然后再将对象的其他请求转发到源。——通常,对第一个请求的响应会在对后续请求的响应之前到达 CloudFront 边缘站点。此短暂中止有助于减少 Amazon S3 上的不必要负载。如果其他请求不完全相同(例如,由于将 CloudFront 配置为根据请求标头或查询字符串进行缓存),则 CloudFront 将所有唯一请求转发到源。

在来自源的响应包含 Cache-Control: no-cache 标头时,CloudFront 通常将同一对象的下一个请求转发到源以确定是否已更新对象。不过,如果遇到流量高峰,并且 CloudFront 在将第一个请求转发到源后中止,在 CloudFront 收到来自源的响应之前,多个查看器请求可能已到达。在 CloudFront 收到包含 Cache-Control: no-cache 标头的响应时,它将响应中的对象发送到发出原始请求的查看器以及在中止期间请求对象的所有查看器。在来自源的响应到达后,CloudFront 将同一对象的下一个查看器请求转发到源。在 CloudFront 访问日志中,第一个请求在 x-edge-result-type 列中的指定为 Miss,而 CloudFront 在中止期间收到的所有后续请求指定为 Hit。有关访问日志文件格式的更多信息,请参阅Web 分配日志文件的格式

CloudFront 如何处理 Amazon S3 源服务器的响应

本主题包含 CloudFront 如何处理来自 Amazon S3 源的响应的相关信息。

已取消的请求

如果对象没有位于边缘缓存中,或者在 CloudFront 从源中获取对象后,查看器便终止了会话(例如,关闭浏览器)而没来得及传送请求的对象,则 CloudFront 不会将该对象缓存在边缘站点中。

CloudFront 删除或更新的 HTTP 响应标头

在将来自 Amazon S3 源的响应转发到查看器之前,CloudFront 将删除或更新以下标头字段:

  • Set-Cookie – 如果将 CloudFront 配置为转发 Cookie,则它将 Set-Cookie 标头字段转发到客户端。有关更多信息,请参阅根据 Cookie 缓存内容

  • Trailer

  • Transfer-Encoding – 如果 Amazon S3 源返回该标头字段,在将响应返回到查看器之前,CloudFront 将值设置为 chunked

  • Upgrade

  • Via – 在对查看方的响应中,CloudFront 将值设置为以下内容:

    Via: http-version alphanumeric-string.cloudfront.net (CloudFront)

    例如,如果客户端通过 HTTP/1.1 发出请求,该值类似于如下所示:

    Via: 1.1 1026589cc7887e7a0dc7827b4example.cloudfront.net (CloudFront)

最大文件大小

CloudFront 将返回到查看器的响应正文的最大大小为 20 GB。这包括未指定Content-Length标头值的分块传输响应。

重定向

您可以配置 Amazon S3 存储桶以将所有请求重定向到另一个主机名称;这可能是另一个 Amazon S3 存储桶或 HTTP 服务器。如果您配置一个存储桶以重定向所有请求,并且该存储桶是 CloudFront 分配的源,我们建议您使用 CloudFront 分配的域名(例如,d111111abcdef8.cloudfront.net)或与分配关联的备用域名 (CNAME)(例如,example.com)配置一个存储桶,以将所有请求重定向到分配。否则,查看器请求会绕过 CloudFront,直接从新源提供对象。

注意

如果您重定向请求到备用域名,您还必须通过添加 CNAME 记录为您的域更新 DNS 服务。有关更多信息,请参阅 通过添加备用域名 (CNAME) 将自定义 URL 用于文件

这是在您配置重定向所有请求的存储桶时所发生的:

  1. 查看器(例如,浏览器)从 CloudFront 请求对象。

  2. CloudFront 将请求转发到 Amazon S3 存储桶,而该存储桶是分配的源。

  3. Amazon S3 返回 HTTP 状态代码 301(永久移动)以及新位置。

  4. CloudFront 缓存重定向状态代码和新位置,并将值返回到查看器。CloudFront 没有进行重定向以从新位置中获取对象。

  5. 查看器发送对象的另一个请求,但查看器此次指定了其从 CloudFront 获取的新位置:

    • 如果 Amazon S3 存储桶使用分配的域名或备用域名将所有请求重定向到 CloudFront 分配,则 CloudFront 从新位置中的 Amazon S3 存储桶或 HTTP 服务器请求对象。当新位置返回对象时,CloudFront 将其返回到查看器并将其缓存在边缘站点。

    • 如果 Amazon S3 存储桶将请求重定向到另一个位置,第二个请求将绕过 CloudFront。新位置中的 Amazon S3 存储桶或 HTTP 服务器直接将对象返回到查看器,因此,从未在 CloudFront 边缘缓存中缓存对象。