【问题标题】:How to avoid caching in browser when replacing contents of page with document.write()用 document.write() 替换页面内容时如何避免在浏览器中缓存
【发布时间】:2012-11-22 10:43:09
【问题描述】:

我在浏览器缓存方面有点挣扎。

我有一个静态 HTML 页面(让我们称之为 index.html),其中包含具有魔力的 javascript(嵌入交互式服务)。这些脚本具有 AJAX 响应错误处理程序,如下所示:

function(response){ // response is prototype.js AJAX response 
  document.open("text/html");
  document.write(response.responseText);
  document.close();
}

当调用它并替换文档内容时,浏览器会缓存(我不希望它被缓存)并且按 F5 不会执行任何操作。办公室。 CTRL+F5 工作正常,但我不能假设用户会这样做。

这个函数是我得到的错误 AJAX 响应的处理程序。它用于将页面内容替换为由前端 Apache HTTP 服务器响应的自定义错误页面,该服务器对另一个 Apache HTTP 服务器具有反向代理,该服务器再次具有对 Tomcat 服务脚本和处理来自它们的请求的反向代理。

前端 Apache HTTP 服务器在其配置错误页面覆盖和缓存控制标头 index.html:

ProxyErrorOverride On
<Files index.html>
  Header set Cache-control "no-cache, no-store, max-age=0, must-revalidate"
  Header set Pragma "no-cache"
  ExpiresByType text/html "access plus 1 second"
</Files>

所以 index.html 的缓存对我来说似乎被关闭了。我假设你看到我正在使用 mod_proxy、mod_headers、mod_expires。

错误页面配备了用于缓存控制的元标记(我知道,我知道它们不能被考虑在内;)并且可以说它的标题看起来像这样:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="cache-control" content="no-cache, no-store, must-revalidate, max-age=0" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Thu, 01 Jan 1970 1:00:00 GMT" />
<meta http-equiv="pragma" content="no-cache" />

所以最后我的场景或多或少是这样的:

  1. 页面加载
  2. 加载并调用javascripts,魔术开始(服务嵌入指定的div,并开始使用AJAX与服务器对话)。
  3. Tomcat/Inner HTTP 服务器已关闭(我不知道软件的维护/升级)
  4. 脚本获取 AJAX 错误响应(responseText 是自定义错误页面,被前端 Apache HTTP 服务器及其错误页面覆盖)
  5. 页面内容正在替换为自定义错误页面
  6. 服务器从4.起来(或者甚至没有,然后它会从不同的级别处理)
  7. 用户点击 F5 页面被重新加载(但没有)

我在这里可能有点混乱,所以如果有不清楚的地方或者我应该提供更多详细信息,请询问我会尽快提供更多信息。

PS: 我认为我的方法可能从根本上错了,或者做了一些愚蠢的事情。如果我知道,请告诉我。

编辑:

实际上它发生在 ff(16.0.2, 17.0) 和 IE9 上。 Chrome、Opera 和 Safari 只需重新加载页面而无需缓存。哦,更糟糕的是,只有当你在地址栏中按回车时,才在 ctrl+f5 上刷新:P

在 ff 我在 documentURI 属性中得到 wycywig:///

【问题讨论】:

  • 我已经设法通过在这个“交互式服务”中实现带有 i18n 错误消息的错误框来开发解决方法。但是当您使用document.write 时,我仍然热衷于如何通过缓存来解决这个问题。

标签: javascript browser-cache


【解决方案1】:

你用的是 IE 吗? IE 喜欢缓存 AJAX 获取请求,而不管缓存头响应如何。您是否尝试过在请求 URL 中添加一个缓存清除字符串,如下所示:

var cacheBuster = '?buster=' + (new Date()).getTime(), //add a timestamp
    url = '/my/url' + cacheBuster;

new Ajax.Request(url, { 
    //... your ajax request 
});

【讨论】:

  • 其实这个东西最早是在 Firefox 16.0.2 上观察到的。
  • 另一方面,这是关于缓存 AJAX 响应的问题,但是我替换了页面的整个内容,链接没有改变。如果我替换位置的搜索部分,它会导致页面自动重新加载。我们陷入了不同的境地。对我来说,这会导致页面重新加载。这是另一件事:如果我的 servlet 响应 404“未找到某些东西”,但服务器运行正常,我将陷入重新加载页面的无限循环。 PS:更改哈希部分不适用于此(在 ie 上也有 iframe)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-10
  • 1970-01-01
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
  • 2014-05-26
  • 2023-03-28
相关资源
最近更新 更多