谷歌浏览器在前进/后退时不重新验证etag

12
即使我发送“缓存控制:必须重新验证”,当在浏览器中使用前进和后退按钮时,Google Chrome仍然使用本地缓存页面。
这是原始响应的一部分:
HTTP/1.1 200 OK
cache-control: private, must-revalidate
etag: "c9239b5d4b98949f8469a05062e05bb999d7512e"
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8

如果我刷新页面,我会得到一个“HTTP/1.1 304 Not Modified”响应,但当我使用返回按钮时,我会得到以下响应:

Request URL:example.com
Request Method:GET
Status Code:200 OK (from cache)

我希望得到的响应是304或200 OK,是否可能实现这一点?

4个回答

23
使用浏览器的“后退”和“前进”按钮时,防止浏览器返回缓存的页面副本的关键Cache-Control指令是no-store。 没有其他需要帮助,也不需要其他东西。您的Cache-Control头可以简单地为:
Cache-Control: no-store

然而,有两个例外情况。

  1. 无论您设置什么头信息,Opera和Safari都不会重新验证(至少在我测试的版本中是这样)。如果您在新标签页中打开页面,则该副本将是最新的,但在前后导航时,原始标签页将继续显示旧版本,直到您刷新或重新输入URL。
  2. Firefox似乎存在缓存第一个打开的页面(即没有返回按钮的情况)的漏洞。随后的所有页面实例都将在前后导航时刷新,但一旦您备份到最顶层的页面,它通常仍然显示其最初的旧版本。

最后,我应该指出,通常不建议使用此指令,因为它显然对带宽使用有重大影响。浏览器甚至无法利用Etags来获取304 Not Modified响应,因为它将没有存储的副本可用于接收到304响应的情况。


1
所以基本上,如果您想让“前进/后退”按钮工作,就不能利用ETag? - Dennis
http://madhatted.com/2013/6/16/you-do-not-understand-browser-history 包含了一个有趣的讨论。 - Gili
浏览器甚至无法利用Etags,这就是我要找的答案,即为什么Etags无法工作。 - rabudde
实际上,Chrome在所有与缓存相关的标头之上应用了一种算法行为,因此ETag可能无法起作用并返回304。 - Rick Luo

6

"must-revalidate"指令仅在响应过期后应用(RFC2616,第14.9.4节)。由于响应未包含“Expires”标头或“max-age”指令,浏览器可能会将响应视为仍然新鲜,并相应地返回缓存副本。为了防止这种情况,您应该在Cache-Control标头中包括“max-age:0”(可能还包括一个过去日期的Expires标头),以使缓存的响应立即过期。或者,为了防止缓存,请使用“no-cache”指令而不是“must-revalidate”。


2
根据RFC2616的13.2.4节:“max-age指令优先于Expires指令”。您不需要两者都使用。无论如何,这都无法防止浏览器在使用后退按钮导航时显示过期的副本。 - James Holderness
我刚刚确认了詹姆斯的评论,这个解决方案无法与返回按钮一起使用。 - Dennis

3
no-store 缓存指示符可以用于指定浏览器不将页面写入磁盘缓存。与 no-cache 结合使用,这应该确保所有浏览器都从上游获取资源而不是从磁盘获取。 Cache-Control: private, no-cache, no-store

除非我希望浏览器在前进和后退时重新验证etag。 - Dennis
2
这将违反 RFC2616 第13.13节 (http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html),该节规定浏览器不应重新验证: "历史机制和缓存是不同的。特别地,历史机制不应尝试显示资源当前状态的语义透明视图。相反,历史机制意味着要展示用户在检索资源时看到的确切内容。" 不重新验证或通过后退按钮访问过期页面的浏览器实际上正在执行正确的操作 - 只是这不是你想要的。 - SpliFF
1
只有 no-store 起作用,因为浏览器没有选择,它没有本地副本可以显示,所以它必须从上游获取。 - SpliFF

0

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