我有 Amazon S3 对象,对于每个对象,我都设置了
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==
即使 Amazon 明确发送了 Cache-Control,Chrome 仍然会发出第二个请求,而不是从 Cache 中读取它。
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 当我在标题中放置一个显式的 Expires 属性时,此行为会发生变化。浏览器不会发送对 Expires 标头的后续请求,但对于公共缓存控制,它会发送它。我所有的 S3 对象永远不会改变,它们是不可变的,当我们更改文件时,我们将它们作为具有新 URL 的新对象。
在页面脚本参考 中,Chrome 仅有时会发出后续请求,我通过在浏览器中实际输入 URL 来进行此测试。当 HTML 页面引用脚本时,对于少数后续请求,chrome 会加载缓存的脚本,但有时会再次向服务器发送请求。这里没有磁盘大小问题,Chrome 有足够的缓存空间。
问题是我们为每个请求收费,我希望 S3 对象被永久缓存,并且应该从缓存加载并且永远不应该连接到服务器。