HTTP缓存:仅在*缓存内容过期后才使用ETag

时间:2015-07-03 21:30:21

标签: html caching

因此,对于某些内容,服务器会发送一个Cache-Control标头,指示内容可以缓存最多120秒,还有一个ETag标头,其中包含一些内容的哈希值。

当浏览器再次请求内容(相同的URL),并假设我们仍然在120秒内时,浏览器是否只使用本地缓存的内容,无论它以前是否已收到ETag且无论如何关于内容的新鲜度ETag可能会说些什么?

这似乎是建议的here(在#34条下;使用ETag验证缓存的响应")。

但是,我的情况是,浏览器中的内容请求似乎正在返回带有 允许缓存下一个请求的标头,但它似乎永远不会。

这是Chrome的响应标题:

access-control-allow-origin:*
cache-control:private, max-age=300
date:Fri, 03 Jul 2015 21:22:33 GMT
etag:W/"208-nZVotiUd/tgf0oV0tBzi8w"

请求标题:

Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-GB,en-US;q=0.8,en;q=0.6
Cache-Control:max-age=0
Connection:keep-alive
If-None-Match:W/"208-nZVotiUd/tgf0oV0tBzi8w"
User-Agent:Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36

在General部分下:

Request Method:GET
Status Code:304 Not Modified

上面的状态代码表明浏览器知道内容没有改变(通过304 response),这意味着确实将请求发送到服务器。尽管事实上内容已经(应该已经)在本地缓存,但仍然在缓存期内。

那么为什么内容不仅仅是从缓存中提取的呢?

我有点怀疑的是请求标题中的Cache-Control:max-age=0 ...可能是由Chrome放在那里,但是......为什么?它有什么影响?我以为Cache-Control是由服务器设置的,而不是从浏览器请求的?

编辑:我看到与html中加载的远程js库类似的东西......响应头表明应该使用缓存,但是每次都会延迟远程js的获取时间延迟。尽管也得到304 response

1 个答案:

答案 0 :(得分:0)

事实证明,在浏览器中加载页面的方式会影响获取缓存资源的方式。见here。我每次都按F5重新加载页面,这似乎迫使浏览器检查是否需要再次获取资源,即使本地缓存的副本仍显然有效。但是,如果您通过单击地址栏重新加载页面并按Enter键,则会遵循相关内容的缓存控制策略。无论如何,那是我的理解。因此,在将来我正在查看我的页面内容是如何被缓存时,我不只是盲目地打F5,我将通过点击输入地址栏来重新加载页面。