【发布时间】:2013-12-13 22:57:51
【问题描述】:
我在 StackOverflow 上看到过相关问题,但没有一个建议对我有用。我需要浏览器在每次显示页面时从服务器重新加载页面,包括用户是否通过按下后退按钮到达那里。似乎浏览器对除基本文档之外的所有内容都遵守缓存规则。这发生在当前版本的 Safari 和 Firefox(截至 2013 年 12 月)中,已通过数据包捕获验证。
我的应用程序中的页面用于编辑数据库记录。在源文件的顶部是几行 PHP,用于存储一个锁,指示正在编辑记录。当锁存在时,其他用户不能编辑相同的记录。这些页面有一个窗口 unload 处理程序,它在非异步模式下使用 AJAX 来释放锁定。 (锁定机制还有更多内容,但这些都是相关部分。)当用户通过返回按钮返回页面时,服务器端代码从不执行。
我尝试过包含标题:
Cache-Control: no-cache, must-revalidate
Safari 的检查器显示标头已被接收并处理,但它仍然没有重新检索页面。
我尝试设置一个处理程序来检查页面的状态是否保持:
window.onpageshow = function(event) {
if (event.persisted) {
window.location.reload();
}
};
if 条件从不匹配:event.persisted 始终为假。
令人讨厌的是,这似乎在技术上是正确的。根据relevant part of the HTML5 spec,由于页面注册了unload 监听器,浏览器应该永远尝试维护页面状态。它没有!当用户按下后退按钮时,浏览器正在“重播”整个页面加载序列,包括ready 事件。它重复所有未缓存先前结果的 AJAX 调用。它唯一拒绝从服务器实际重新加载的是主文档本身。
如何让它重新加载主文档?
【问题讨论】:
-
我不确定你是否能够在代码中解决这个问题......似乎每个浏览器都会有不同的问题。也许如果您能说明根本问题是什么,我们可以尝试找到解决方案?
-
我帖子的最后一行旨在成为潜在的问题:如何让浏览器重新加载主文档,每次显示页面时再次明确地对服务器进行 GET 调用?
标签: javascript html browser-cache