Amazon S3 源的请求和响应行为 - Amazon CloudFront
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon S3 源的请求和响应行为

如何 CloudFront 处理请求并将其转发到您的 Amazon S3 源

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

缓存持续时间和最小 TTL

要控制您的对象在将另一个请求 CloudFront 转发到您的源之前在 CloudFront 缓存中停留多长时间,您可以:

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

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

  • 使用默认值 24 小时。

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

客户端 IP 地址

如果查看者向其 CloudFront 发送请求但不包含X-Forwarded-For请求标头,则从 TCP 连接中 CloudFront 获取查看者的 IP 地址,添加包含 IP 地址的X-Forwarded-For标头,然后将请求转发到源。例如,如果192.0.2.2从 TCP 连接中 CloudFront 获取 IP 地址,则会将以下标头转发到源:

X-Forwarded-For: 192.0.2.2

如果查看者向其发送请求 CloudFront 并包含X-Forwarded-For请求标头,则从 TCP 连接中 CloudFront 获取查看者的 IP 地址,将其附加到X-Forwarded-For标头的末尾,然后将请求转发到源。例如,如果查看者请求包含X-Forwarded-For: 192.0.2.4,192.0.2.3192.0.2.2从 TCP 连接中 CloudFront 获取 IP 地址,则它会将以下标头转发到源:

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::8a2e:0370:7334)。

有条件的 GET

当 CloudFront 收到边缘缓存中已过期的对象的请求时,它会将该请求转发给 Amazon S3 源以获取该对象的最新版本,或者获得 Amazon S3 确认 CloudFront 边缘缓存已有最新版本。当 Amazon S3 最初将对象发送到时 CloudFront,它在响应中包含了一个ETagLastModified值和一个值。在 CloudFront 转发到 Amazon S3 的新请求中, CloudFront 添加以下一项或两项:

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

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

Amazon S3 使用此信息来确定对象是否已更新,从而确定是将整个对象返回到 CloudFront 还是仅返回 HTTP 304 状态码(未修改)。

Cookie

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

跨源资源共享 (CORS)

如果您 CloudFront 想尊重 Amazon S3 跨域资源共享设置,请配置 CloudFront 为将所选标头转发到 Amazon S3。有关更多信息,请参阅根据请求标头缓存内容

包含正文的 GET 请求

如果查看者GET请求包含正文,则会向查看者 CloudFront 返回 HTTP 状态码 403(禁止)。

HTTP 方法

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

  • DELETE

  • GET

  • HEAD

  • OPTIONS

  • PATCH

  • POST

  • PUT

CloudFront 总是缓存对GETHEAD请求的响应。您也可以配置为缓存 CloudFront 对OPTIONS请求的响应。 CloudFront 不缓存对使用其他方法的请求的响应。

如果您想使用分段上传将对象添加到 Amazon S3 存储桶,则必须向分配中添加CloudFront 源访问控制 (OAC),并授予 OAC 所需的权限。有关更多信息,请参阅限制对 Amazon S3 源的访问

重要

如果您配置 CloudFront 为接受所有 CloudFront支持的 HTTP 方法并将其转发给 Amazon S3,则必须创建 CloudFront 源访问控制 (OAC) 来限制对您的 Amazon S3 内容的访问并授予 OAC 所需的权限。例如,如果您因为要使用而配置 CloudFront 为接受和转发这些方法PUT,则必须配置 Amazon S3 存储桶策略以适当地处理DELETE请求,这样查看者就无法删除您不希望他们删除的资源。有关更多信息,请参阅限制对 Amazon S3 源的访问

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

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

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

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

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

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

如果请求或 URL 超过这些最大值,则会向查看者 CloudFront 返回 HTTP 状态代码 413 “请求实体太大”,然后终止与查看器的 TCP 连接。

OCSP Stapling

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

当 CloudFront 收到针对同一域中对象的大量 HTTPS 请求时,OCSP 装订的性能提高更为明显。 CloudFront 边缘站点中的每台服务器都必须提交单独的验证请求。当 CloudFront 收到针对同一域的大量 HTTPS 请求时,边缘位置的每台服务器很快就会收到来自 CA 的响应,表示它可以在 SSL 握手中 “装订” 数据包;当查看者对证书有效感到满意时, CloudFront 可以为请求的对象提供服务。如果您的分发在 CloudFront 边缘位置没有获得太多流量,则新请求更有可能被定向到尚未通过 CA 验证证书的服务器。在这种情况下,查看器单独执行验证步骤, CloudFront 服务器为对象提供服务。该 CloudFront 服务器还会向 CA 提交验证请求,因此,在它下次收到包含同一域名的请求时,便已获得来自 CA 的验证响应。

协议

CloudFront 根据查看者请求的协议(HTTP 或 HTTPS)将 HTTP 或 HTTPS 请求转发到源服务器。

重要

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

查询字符串

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

源连接超时和尝试次数

源连接超时是指尝试与源建立连接时 CloudFront 等待的秒数。

源连接尝试次数是 CloudFront 尝试连接到源站的次数。

这些设置共同决定了在故障转移到辅助源(如果是源组)或向查看者返回错误响应之前 CloudFront 尝试连接到源站的时间。默认情况下, CloudFront 在尝试连接到辅助源或返回错误响应之前,会等待 30 秒(3 次尝试,每次尝试 10 秒)。您可以通过指定更短的连接超时和/或更少的尝试次数来减少此时间。

有关更多信息,请参阅 控制源超时和尝试次数

源响应超时

源响应超时(也称为源读取超时源请求超时)同时适用于以下两种情况:

  • 将请求转发到源服务器后 CloudFront 等待响应的时间(以秒为单位)。

  • 在收到来自源端的响应数据包之后到收到下一个数据包之前 CloudFront 等待的时间,以秒为单位。

CloudFront 行为取决于查看者请求的 HTTP 方法:

  • GETHEAD请求 — 如果源站在 30 秒内没有响应或在 30 秒内停止响应,则 CloudFront 断开连接。如果指定的源连接尝试次数大于 1,则再次 CloudFront 尝试以获得完整的响应。 CloudFront 最多尝试 3 次,具体取决于源连接尝试次数设置的值。如果源站在最后一次尝试中 CloudFront 没有响应,则在收到有关同一来源的内容的另一个请求之前不会重试。

  • DELETEOPTIONSPATCHPUT、和POST请求 — 如果源在 30 秒内没有响应 CloudFront ,则断开连接并且不会再次尝试联系源。如有必要,客户端可以重新提交请求。

您无法更改 Amazon S3 源( 配置为静态网站托管的 S3 存储桶)的响应超时。

针对同一对象的并发请求(请求折叠)

当 CloudFront 边缘站点收到对象请求但该对象不在缓存中或缓存的对象已过期时,会 CloudFront 立即将请求发送到源。但是,如果同时有针对同一对象的请求(也就是说,如果对同一对象(使用相同的缓存密钥)的其他请求在 CloudFront 收到第一个请求的响应之前到达边缘位置,则会在将其他请求转发到源之前CloudFront 暂停。这种短暂的停顿有助于减轻原点的负载。 CloudFront 将原始请求的响应发送给它在暂停期间收到的所有请求。这称为请求折叠。在 CloudFront 日志中,第一个请求在x-edge-result-type字段Miss中标识为 a,折叠的请求被标识为Hit。有关 CloudFront 日志的更多信息,请参阅CloudFront 和边缘函数日志

CloudFront 仅折叠共享缓存密钥的请求。如果其他请求不共享相同的缓存密钥,例如您配置 CloudFront 为基于请求标头、Cookie 或查询字符串进行缓存,则会将所有具有唯一缓存密钥的请求 CloudFront 转发到您的源。

如果您想防止所有请求崩溃,则可以使用托管缓存策略CachingDisabled,该策略还可以防止缓存。有关更多信息,请参阅使用托管缓存策略

如果要阻止特定对象的请求折叠,可以将缓存行为的最小 TTL 设置为 0,配置源以发送 Cache-Control: privateCache-Control: no-storeCache-Control: no-cacheCache-Control: max-age=0Cache-Control: s-maxage=0。这些配置将增加源站的负载,并给在等待第一个请求的响应时暂停 CloudFront 的同步请求带来额外的延迟。

如何 CloudFront 处理来自您的 Amazon S3 来源的响应

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

已取消的请求

如果某个对象不在边缘缓存中,并且如果查看者在从您的源端 CloudFront 获取对象之后但在交付请求的对象之前终止了会话(例如,关闭浏览器),则 CloudFront 不会将该对象缓存到边缘位置。

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

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

  • X-Amz-Id-2

  • X-Amz-Request-Id

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

  • Trailer

  • Transfer-Encoding— 如果您的 Amazon S3 源返回此标头字段,则在将响应返回给查看者chunked之前,请将该值 CloudFront 设置为。

  • Upgrade

  • Via— 在对查看者的响应中将值 CloudFront 设置为以下值:

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

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

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

最大可缓存文件大小

保存在缓 CloudFront 存中的响应正文的最大大小为 50 GB。这包括未指定 Content-Length 标头值的分块传输响应。

您可以使用 CloudFront 缓存大于此大小的对象,方法是使用范围请求按每个 50 GB 或更小的分段请求对象。 CloudFront缓存这些部分,因为每个部分的大小都不超过 50 GB。查看器检索完对象的所有段后,可以重建更大的原始对象。有关更多信息,请参阅 使用范围请求缓存大型对象

重新导向

您可配置 Amazon S3 存储桶以将所有请求重定向到另一个主机名称;这可能是另一个 Amazon S3 存储桶或 HTTP 服务器。如果您将存储桶配置为重定向所有请求,并且该存储桶是分配的来源,我们建议您使用 CloudFront分配的域名(例如 d111111abcdef8.cloudfront.net)或与分配关联的备用域名(CNAME)(例如 example.com)配置存储桶,以将所有请求重定向到分配。 CloudFront 否则,将绕过查看者的请求 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 边缘缓存中。