41

我有 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 对象被永久缓存,并且应该从缓存加载并且永远不应该连接到服务器。

4

5 回答 5

43

当您F5在 Chrome 中按下时,它总是会向服务器发送请求。这些将与Cache-Control:max-age=0标题一起制作。服务器通常会以 304(未更改)状态码进行响应。

当您按Ctrl+F5Shift+F5时,将执行相同的请求,但带有Cache-Control:no-cache标头,从而强制服务器发送未缓存的版本,通常带有 200(OK)状态代码。

如果您想确保使用本地浏览器缓存,只需按Enter地址栏中的 。

于 2016-06-07T08:18:19.487 回答
23

如果 HTTP 响应包含 etag 条目,则将始终发出条件请求。ETag 是一个缓存验证器标签。客户端将始终将 etag 发送到服务器以查看元素是否已被修改。

于 2013-10-23T07:49:06.957 回答
9

如果 Chrome 开发者工具打开 (F12),Chrome 通常会禁用缓存。

它可以在开发工具设置中控制 - 开发工具顶部栏右侧的齿轮图标。

于 2014-07-15T16:31:19.570 回答
1

如果您点击刷新按钮以加载特定页面或资源,if-modified-since则每次都会发送标头请求,如果您改为在新选项卡中将页面/资源作为单独的请求或通过脚本或 html 页面中的链接请求,它将从浏览器缓存本身加载页面/资源。

这就是我的情况,可能这是普遍的情况。我不完全确定,但这是我通过挖掘收集到的。

于 2016-03-11T14:55:44.230 回答
1

ChromeCache-control: max-age=0在您使用自签名证书时添加标头。从 HTTPS 切换到 HTTP 将删除此标头。

Firefox 不添加此标头。

于 2021-07-16T17:03:02.933 回答