【发布时间】:2013-06-25 22:59:04
【问题描述】:
我有一个 Web 应用程序可以让浏览器长时间缓存 AJAX 请求结果。当检测到可能的修改时,我发现了如何发出完全绕过缓存的请求。但我想让用户触发数据刷新。
在这种情况下,我希望浏览器与服务器检查缓存是否停止但如果不是则使用它(即,如果服务器以 304 代码响应) .目标是节省加载时间,因为数据量很大。
服务器在所有响应中包含以下标头:
Cache-Control: private, max-age=604800
Last-Modified: ... # actual last modification date
通过在请求中使用以下 HTTP 标头,我设法在 Chrome(尚未测试其他浏览器)中完全爆破缓存的对象:
Cache-Control: max-age=0
If-Last-Modified: Tue, 01 Jan 1970 01:00:00 +0100
If-Last-Modified 行是真正有效的行。 Chrome 似乎忽略了请求中的 Cache-Control 标头。
我还发现,在服务器响应中使用Cache-Control: must-revalidate 会强制浏览器针对每个 请求向服务器验证其缓存。
但是有没有办法重新验证一个精确的请求,由客户端决定?
请注意,我并不特别喜欢使用 HTTP 标头执行此操作,因此欢迎使用我不知道的任何其他方法!
【问题讨论】:
-
所以只需使用
If-Last-Modified和最后一个Last-Modified响应头。 -
我试过了,我确实从服务器得到了304,但是浏览器没有使用缓存来填充响应,所以它在代码中是空的......我假设浏览器对它自己未添加的
If-Last-Modified标头不感兴趣。 -
那么,假设您自己缓存最后一个响应,您必须手动执行此操作,即如果响应为 200,则覆盖您的缓存,如果响应为 304,则使用旧副本。它可以很容易地抽象出来。
标签: javascript ajax http browser-cache cache-control