Cache-Control: public, max-age=3600000
大约为41天。
我设置了Amazon CloudFront分发,最小TTL也为3600000。
这是清除缓存后的第一次请求。
GET /1.0.8/web-atoms.js HTTP/1.1
Host: d3bhjcyci8s9i2.cloudfront.net
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
响应结果为
HTTP/1.1 200 OK
Content-Type: application/x-javascript
Content-Length: 226802
Connection: keep-alive
Date: Wed, 28 Aug 2013 10:37:38 GMT
Cache-Control: public, max-age=3600000
Last-Modified: Wed, 28 Aug 2013 10:36:42 GMT
ETag: "124752e0d85461a16e76fbdef2e84fb9"
Accept-Ranges: bytes
Server: AmazonS3
Age: 342557
Via: 1.0 6eb330235ca3971f6142a5f789cbc988.cloudfront.net (CloudFront)
X-Cache: Hit from cloudfront
X-Amz-Cf-Id: 92Q2uDA4KizhPk4TludKpwP6Q6uEaKRV0ls9P_TIr11c8GQpTuSfhw==
即使亚马逊明确发送了Cache-Control头信息,Chrome仍然会发出第二个请求,而不是从缓存中读取。
GET /1.0.8/web-atoms.js HTTP/1.1
Host: d3bhjcyci8s9i2.cloudfront.net
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
If-None-Match: "124752e0d85461a16e76fbdef2e84fb9"
If-Modified-Since: Wed, 28 Aug 2013 10:36:42 GMT
问题: 为什么Chrome会发出第二个请求?
过期时间 当我在请求头中添加一个明确的过期时间属性时,这种行为会发生变化。浏览器不会为Expires头发送后续请求,但对于cache-control public,它会发送请求。我的所有S3对象永远不会更改,它们是不可变的,当我们更改文件时,我们将它们作为新对象放置到具有新URL的位置。
页面脚本引用 Chrome有时只会进行几次后续请求,我通过实际在浏览器中输入URL进行了测试。当HTML页面引用脚本时,对于一些后续请求,Chrome会加载缓存的脚本,但偶尔还是会向服务器发送请求。这里没有磁盘大小问题,Chrome具有足够的缓存空间。
问题在于我们每次请求都要付费,我希望S3对象能永久缓存,并应该从缓存中加载,而不应该再连接到服务器。
F5
和Enter
发出不同的请求。 - Gras Doublefetch
来检查它是否真的从磁盘获取。例如:fetch('YOUR_URL')
- Victor CastroExpires
头来实现。 - Oliver SalzburgShift+F5
,请求中也没有if-none-match
头。 - maaartinus