Firefox与Chrome均不缓存HTTP Range请求,该请求是否存在问题?
HTTP Range请求未被浏览器缓存的问题分析
Firefox 102.0.1和Chrome 103.0.5060.53均未缓存以下HTTP Range请求:
await fetch("https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/2020/S2A_36QWD_20200701_0_L2A/TCI.tif", { "credentials": "omit", "headers": { "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0", "Accept": "*/*", "Accept-Language": "en-US,en;q=0.5", "Range": "bytes=0-5", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "cross-site" }, "referrer": "http://localhost:8080/", "method": "GET", "mode": "cors" });
该请求在Firefox中返回的响应如下:
HTTP/1.1 206 Partial Content x-amz-id-2: jGkETlSznrL2heZz48jtyNuZelyqgCBJFDGgGMlzkWeQ3Eyha16y8bs1A4kJbcyXCOpPtmGmFis= x-amz-request-id: B0NZTXZGYV6D6YPT Date: Tue, 12 Jul 2022 09:49:45 GMT Access-Control-Allow-Origin: * Access-Control-Allow-Methods: HEAD, GET Vary: Origin, Access-Control-Request-Headers, Access-Control-Request-Method Last-Modified: Wed, 01 Jul 2020 15:33:02 GMT ETag: "1cfd50c6d5047f6e76a2c8b848e2866c-28" Cache-Control: public, max-age=31536000, immutable Accept-Ranges: bytes Content-Range: bytes 0-5/234841786 Content-Type: image/tiff; application=geotiff; profile=cloud-optimized Server: AmazonS3 Content-Length: 6
请求本身无问题,浏览器不缓存是符合规范的行为
这个请求在语法和HTTP协议层面没有错误,浏览器不缓存该Range请求的原因主要有几点:
- 尽管响应头包含
Cache-Control: public, max-age=31536000, immutable,但浏览器对带Range头部的部分请求缓存策略更严格。HTTP规范允许缓存部分响应,但需要同时具备ETag或Last-Modified标识(本次响应两者都存在),但实际浏览器对这类缓存的支持有限。 - 本次请求是跨域场景(
Sec-Fetch-Site: cross-site),Chrome和Firefox在处理跨域Range请求时,出于安全或实现细节考虑,会选择不缓存这类响应,即使响应头明确允许缓存。
内容的提问来源于stack exchange,提问作者Sebastien Guimmara
相关产品推荐
相关产品推荐

