Google Chrome不会反复重新验证etag

Den*_*nis 12 etag http cache-control browser-cache

即使我发送"缓存控制:必须重新验证",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
Run Code Online (Sandbox Code Playgroud)

如果我刷新页面,我得到一个"HTTP/1.1 304 Not Modified"响应但是当我使用后退按钮时,我得到以下响应:

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

我正在寻找的响应是304或200 OK,是否有可能实现这一目标?

Jam*_*ess 17

使用后退和前进按钮时,键Cache-Control指令阻止浏览器返回页面的缓存副本no-store.

没有其他任何东西可以帮助,也不需要任何其他东西.你的Cache-Control标题可以简单地是:

Cache-Control: no-store
Run Code Online (Sandbox Code Playgroud)

但是有两个例外.

  1. 无论你设置什么标题,Opera和Safari都不会重新验证(至少是我测试过的版本).如果您在新选项卡中打开该页面,该副本将是新鲜的,但在您刷新或重新输入URL时,原始选项卡将继续显示来回导航的陈旧版本.
  2. Firefox似乎在打开第一页的缓存中存在错误(即没有后退按钮时).当您来回导航时,页面的所有后续实例都会刷新,但是一旦您一直备份到最顶层的页面,它通常仍会显示其初始陈旧副本.

最后,我应该注意,通常不建议使用此指令,因为它显然会对带宽使用产生重大影响.浏览器甚至无法利用Etags获取304 Not Modified响应,因为在收到响应的情况下,它不会使用存储的副本304.


Pet*_* O. 6

“必须重新验证”指令仅在响应失效后才适用(RFC2616, sec 14.9.4)。由于响应既不包含“Expires”标头也不包含“max-age”指令,浏览器可能将响应视为仍然新鲜并相应地返回缓存副本。为了防止这种情况,您应该在 Cache-Control 标头中包含“max-age: 0”(可能还有一个包含过去日期的 Expires 标头),以便缓存的响应立即变得陈旧。或者,为了防止缓存,请使用“no-cache”指令而不是“must-revalidate”。

  • 从 RFC2616 的 13.2.4 开始:“max-age 指令优先于 Expires”。你不需要两者。无论如何,这些都不会阻止浏览器在使用后退按钮导航时显示过时的副本。 (2认同)