强制 AJAX 请求与服务器重新验证缓存,而无需完全重新加载。

9
我有一个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 响应头即可。 - Ja͢ck
我已经尝试过了,确实从服务器得到了304状态码,但浏览器并没有使用缓存来填充响应,所以代码中是空的...我想浏览器对于自己没有添加的"If-Last-Modified"头部似乎不感兴趣。 - rixo
假设您自己缓存了最后的响应,那么您必须手动执行此操作,即如果响应为200,则覆盖您的缓存,如果响应为304,则使用旧副本。它可以很容易地被抽象化。 - Ja͢ck
1个回答

2

您可以添加一个基于时间的URL参数来清除缓存,以便仅针对一个精确请求。

$.ajax({
    url:"/questions?nocache="+Date.now(),
    "success":function(data){
         console.log(data);
    }
});

1
我不想完全绕过缓存,我希望浏览器询问服务器是否其缓存仍然有效,并在接收到304时使用它。仅当服务器回复200时,缓存应该被丢弃。 - rixo

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