如何防止HTML5页面缓存?

30
我将一个普通的HTML页面转换为具有响应式布局的HMTL5/CSS3页面,出于安全原因(由安全人员规定),该页面必须永远不被缓存。此前,该页面使用<meta http-equiv="Pragma" content="no-cache"><meta http-equiv="Expires" content="-1">来防止页面被缓存。在HTML5中,这些元素的替代品是什么?如何防止客户端缓存html页面?我已经花了一周时间研究清单文件,但它们似乎与我想要的完全相反,因为显式地附加清单文件会导致其所附加的页面被缓存。请不要让我回到w3c定义哪些元素现在允许使用的定义上——我知道HTML5不在meta元素中包括cache-controlPragma。我需要知道它包括哪些内容可以防止页面被缓存。

4
你可以使用真正的HTTP头信息,而不是伪造的HTML头信息。请访问http://www.mnot.net/cache_docs/获取相关文档。 - Patrick James McDougle
4个回答

36
在编程的开头,你需要使用这个:
<!DOCTYPE html>
<html manifest="manifest.appcache">
...

接下来创建一个名为manifest.appcache的文件,内容如下:

CACHE MANIFEST
# 缓存清单版本 1.0
# 禁止缓存
NETWORK: *

3
补充@n1ckolas的回答,可以查看http://www.w3.org/TR/html5/browsers.html#manifests获取详细信息。 - Jason N. Gaylord
2
谢谢,这个方法可以防止文件被缓存,但现在在Firefox中会弹出一个信息栏,显示:“此网站正在请求在您的计算机上存储离线数据。” 这正好与我想要发生的相反。非常烦人,对于我们的新手用户来说也不太友好 - 我们服务于不太懂互联网的医疗专业人员。有没有办法保留清单并摆脱信息栏,或者这只是Firefox的方式? - gps03
我其实不太确定...你可以将它移动到另一个问题中,我很乐意看到答案 :) - n1ckolas
1
一个等效的解决方案是引用一个不存在的清单文件: <html manifest="/doesnt-exist.appcache">但这会在Chrome开发者工具的控制台中显示。 - Alexander Taylor
6
此功能已从Web标准中删除。虽然某些浏览器可能仍支持它,但正在被废弃。如果可能的话,请避免使用它并更新现有代码;请参考本页面底部的兼容性表格来指导您的决策。请注意,此功能随时可能停止工作。 - Raj Parmar
显示剩余2条评论

5

我极其不喜欢应用缓存。它几乎能够正常工作,但是也可能会带来很多麻烦。在进行代码重构时,我意识到在注销后,我可以浏览回到上一页。当然,刷新浏览器会强制用户返回登录页面,但这并不是想要的。

在搜索了一圈并看到选项后,我开始有点沮丧。我不想使用应用缓存。然后我意识到,在销毁会话后,我的代码会重定向到登录页面,于是我想到了一个主意,如果我重定向到主页呢?然后,页面被加载,会话被检查(当然不存在),用户被重定向到登录页面。问题解决了。


5
我已经苦苦挣扎了相当长一段时间,以下是我目前在Chrome、FF和IE中的解决方法:

1) 引用清单文件 <html lang="nl" manifest="filename.appcache"> 我的理解是,这将缓存此HTML文档后面的所有内容,因此需要一个清单文件来防止发生这种情况:

2) 使用一个名为filename.appcache的清单文件,并使用以下内容,基本上表示:对于所有文件,不要从缓存中读取,而是从网络服务器中读取:
CACHE MANIFEST
# 2015-09-25 time 20:33 UTC v 1.01 
NETWORK:
*


第三步骤:每次上传网站的(部分)更新时,还需要更改清单文件,通过在注释(#)行中更改日期和时间戳。为什么?因为如果您不更改清单文件,它将不会被读取,并且它将默认为步骤1,因此缓存并从缓存中读取。但是,清单文件发生变化会强制再次读取清单文件,从而强制执行其中的“不要从缓存中读取,而要从网络服务器中读取”的指令。


1
请注意,此缓存清单功能已从Web标准中删除。 - Totor

1

之前的回答可能无法始终有效地防止在Chrome中缓存或清除现有缓存,但有一个解决方法。

1) 要清除Chrome中的现有缓存,可能需要更新网站的所有文件(例如,在每个页面上链接到一个新的CSS文件)以及更新缓存清单,然后才能在第二次访问页面时清除Chrome中的现有缓存(因为页面呈现的方式“流程”:第一次访问页面时,浏览器读取并缓存清单,同时继续从现有缓存中加载。只有在第二次访问时,才会读取和应用新存储的已更新清单)。

2) 如果以上方法都无法解决问题,可以在清单文件中包含一个脚本来检查新的清单文件,如果找到,则重新加载并使用新的清单文件。这个方法解决了我测试过程中所有仍然被 Chrome 持久缓存的文件的问题。我在this page上找到了这个脚本,作者是 Jason Stimpel。

<script type="text/javascript">
window.addEventListener('load', function (e) {
window.applicationCache.addEventListener('updateready', function (e) {
        window.location.reload();
    }, false);
}, false);
</script>

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