对于大的对象,浏览器可以发出多个GET
请求,使用Range request
头分多次下载对象。
当CloudFront收到Range GET
请求时,先检查cache,如果在缓存中就立即返回结果;如果不在缓存中,先将请求发送到源:
Range GET
:返回requested range。(S3也支持Range GET
)Range GET
:返回整个对象。CloudFront返回给前端整个对象,但当下一次请求时,由于CloudFront已经此对象缓存,所以返回requested range。当开启 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的文件缓存下来,未来其他请求过来时就不用再回源。