为什么Chrome仍然缓存这个请求?

4

我有一个页面,所有缓存控制都已设置好,但是Google Chrome仍然从缓存中获取它。我们清空了所有导航历史记录,但重新加载后,Chrome仍然将其缓存:

Request URL:http://stuf.com/path/to/foo
Request Method:GET
Status Code:200 OK (from cache)
Response Headers
Accept-Ranges:bytes
Age:0
Cache-Control:no-cache, no-store, max-age=0, must-revalidate
Content-Encoding:gzip
Content-Language:fr
Content-Length:7289
Content-Type:text/html; charset=utf-8
Date:Fri, 17 Jul 2015 23:19:54 GMT
Expires:Fri, 01 Jan 2010 00:00:00 GMT
Server:nginx
Vary:Accept-Language, Cookie, Accept-Encoding
Via:1.1 varnish
X-Varnish:1867509088
X-Varnish-Cache:MISS
Request Headers
Provisional headers are shown
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36

我们确实设置了varnish,但从X-Varnish-Cache可以看出它是未命中的。此外,状态代码部分指出Chrome正在使用缓存。

1个回答

2
在您的响应头中,Chrome指出年龄为0,即响应已经被缓存了一秒钟或更短的时间。
如果您等待超过一秒钟或包含一个缓存验证器(条件请求):一个ETagLast-Modified标头 ,浏览器可以触发重新验证而不是正常的GET请求,那么它可能会起作用。
问题可能是must-revalidate(您不需要使用max-age=0):
当缓存接收到一个带有must-revalidate指令的响应时,在未经过与原始服务器的重新验证之前,该缓存不得使用变得陈旧的条目来响应后续请求。
没有ETagLast-Modified标头,就无法进行重新验证。
此外,您可以跳过Expires标头。
如果响应同时包含Expires头和max-age指令,则max-age指令会覆盖Expires头,即使Expires头更为严格。此规则允许源服务器为给定的响应提供比HTTP/1.0缓存更长的到期时间,以便于HTTP/1.1(或更高版本)缓存的使用。引自RFC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接