用document.write()替换页面内容时如何避免在浏览器中缓存

时间:2012-11-22 10:43:10

标签: javascript browser-cache

我有点挣扎于浏览器缓存。

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

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

当调用它并更换文档内容时,浏览器缓存(我不想让它被追逐)它并且点击F5什么都不做。 OFC。 CTRL + F5工作正常,但我不能假设用户会这样做。

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

Front 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 /内部HTTP服务器已关闭(我不知道软件的维护/升级)
  4. 脚本获取AJAX错误响应(responseText是由前Apache HTTP服务器覆盖的自定义错误页面及其错误页面)
  5. 页面内容正在被自定义错误页面替换
  6. 来自4.的服务器起来(甚至没有,然后它将从不同的级别处理)
  7. 用户点击F5页面已重新加载(但它没有)
  8. 我在这里可能有点乱,所以如果有什么不清楚或我应该提供更多细节,请问我会尽快提供额外的信息。

    PS: 我认为我的方法或做一些愚蠢的事情可能从根本上是错误的。如果我这样做,请告诉我。

    修改

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

    如果我在documentURI属性中获得wycywig:///

1 个答案:

答案 0 :(得分:0)

您使用的是IE吗?无论缓存标头响应如何,IE都喜欢缓存AJAX get请求。您是否尝试将缓存清除字符串添加到请求URL中,如下所示:

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

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