range GETs

对于大的对象,浏览器可以发出多个GET请求,使用Range request头分多次下载对象。

当CloudFront收到Range GET请求时,先检查cache,如果在缓存中就立即返回结果;如果不在缓存中,先将请求发送到源:

  • 如果源支持Range GET:返回requested range。(S3也支持Range GET
  • 如果源不支持Range GET:返回整个对象。CloudFront返回给前端整个对象,但当下一次请求时,由于CloudFront已经此对象缓存,所以返回requested range。

使用range request缓存大文件

开启 CloudFront cache时,CloudFront不会缓存或取回大于30GB的文件(源在Content-length响应头中会返回文件大小),这时CloudFront会返回给前端错误;当关闭CloudFront Cache时,CloudFront可以取回大于30GB的文件并返回给前端,但CloudFront不会缓存这个文件。

但是使用range request,可以让CloudFront缓存大于30GB的文件。例如源中有一个100GB的大文件,开启CloudFront Cache时,前端可以发range请求,在请求头中携带 Range: bytes=0-21474836480(每部分20GB),下一次请求发送 Range: bytes=21474836481-42949672960 … 在这个场景下,CloudFront会将每20GB的文件缓存下来,未来其他请求过来时就不用再回源。