12

即使我发送“缓存控制:必须重新验证”谷歌浏览器在使用浏览器中的来回按钮时使用本地缓存页面。

这是原始回复的一部分:

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

4 回答 4

23

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

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

Cache-Control: no-store

不过这有两个例外。

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

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

于 2013-05-12T11:40:33.870 回答
6

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

于 2013-05-07T02:23:56.107 回答
3

缓存指令可no-store用于指示浏览器不要将页面写入磁盘缓存。结合no-cache这应该确保所有浏览器将从上游而不是从磁盘获取资源。

Cache-Control: private, no-cache, no-store

于 2013-05-12T04:38:58.033 回答
0

缓存控件未设置,强制浏览器使用default. (在此处阅读有关缓存选项的更多信息:https ://developer.mozilla.org/en-US/docs/Web/API/Request/cache )

为了重新评估缓存,您必须配置服务器以发送Cache-Control: no-cache标头;或通过设置Request.cache = 'no-cache'选项浏览器/客户端。仅此选项就足以正确使用 ETag。

于 2021-07-16T10:45:58.093 回答