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

CloudFront 如何处理对象的部分请求(Range GET)

对于大型对象,最终用户的浏览器或客户端可能做出多个 GET 请求并使用 Range 请求标头以较小的单元下载对象。字节范围的这些请求,有时也被称为 Range GET 请求,提高了部分下载的效率和恢复部分失败的传输。

在 CloudFront 收到 Range GET 请求时,它检查接收请求的边缘站点中的缓存。如果边缘站点中的缓存已经包含整个对象或对象的被请求部分,CloudFront 则立即从缓存提供被请求的范围。

如果缓存不包含被请求的范围,CloudFront 则将请求转发到源。(为了优化性能,CloudFront 请求的范围可能比客户端在 Range GET 中请求的更大。) 接下来会发生的操作取决于源是否支持 Range GET 请求:

  • 如果源支持 Range GET 请求:它返回请求的范围。CloudFront 提供请求的范围,并且还缓存该范围以处理将来的请求。(Amazon S3 支持 Range GET 请求,就像一些 HTTP 服务器一样,例如,Apache 和 IIS。有关 HTTP 服务是否支持的信息,请参阅 HTTP 服务器的文档。)

  • 如果源不支持 Range GET 请求:它返回整个对象。CloudFront 提供整个对象,并且还缓存整个对象以处理将来的请求。在 CloudFront 在边缘缓存中缓存整个对象后,它提供请求的范围以响应 Range GET 请求。

无论是哪种情况,CloudFront 都会在第一个字节到达后从源开始向最终用户提供所请求的范围或对象。

注意

如果查看器发出 Range GET 请求,并且源返回 Transfer-Encoding: chunked,则 CloudFront 将整个对象返回到查看器而不是请求的范围。

CloudFront 通常遵循 Range 标头的 RFC 规范。但是,如果您的 Range 标头不符合以下要求,CloudFront 将返回 HTTP 状态代码 200 和完整的对象,而不是状态代码 206 和指定的范围:

  • 范围必须列按升序排列。例如,100-200,300-400 是有效的,300-400,100-200 是无效的。

  • 范围不能重叠。例如,100-200,150-250 是无效的。

  • 所有范围的规范必须有效。例如,您不能指定负值作为范围的一部分。

有关 Range 请求标头的更多信息,请参阅超文本传输协议 -- HTTP/1.1 中的第 14.35 节“范围”,网址为 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35