【问题标题】:Avoiding browser cache for updates避免浏览器缓存更新
【发布时间】:2010-12-18 19:18:06
【问题描述】:

在阅读this question 之后,我想知道是否可以通过将我的应用程序版本附加到我的索引文件顶部的 uri 来防止浏览器缓存....就像这样:

$revision = getRevision();
if($_GET['v'] != $revision){
  header('Location: index.php?v=' . $revision);
}

这行得通吗?

最终目标是重置整个缓存 - JavaScript, CSS, images - 当我推送更新时,最好是一个不错的小班轮

【问题讨论】:

    标签: php html browser-cache


    【解决方案1】:

    如果页面本身被缓存,是的。您还必须对通过站点上的 URL 可用的任何图像/css/js 或外部文件执行此操作(假设您正在传递缓存标头,因此它们实际上已被缓存)并且包含在该页面中,因为浏览器会缓存所有可用的 URL,并且它们不会按调用它们的页面分组在一起——它们都是独立的。因此,如果 index.php 包含一个 IMG,那么即使您更改 index.php?v=1234,该 IMG 仍会从缓存中调用。您还必须在图像上添加 ?v=1234 才能重新获取页面和图像。

    版本系统通常是您附加到所有可以修改的可缓存 URL(如 css 和 js)但希望在更新后立即失效的东西。您通常以任何有意义的方式将 ?VERSION 附加到 URL 或将 ?version=VERSION 附加到所有 URL(确保不破坏 URL 参数)。

    【讨论】:

    • 有没有办法以简单的方式将其附加到所有 URL?
    • 简而言之,是和不是。如果您使用通用函数来生成所有 URL,那么您显然可以轻松地进行此修改。同样,如果您使用模板系统,您只需将 {{version}} 之类的内容添加到所有 URL 的末尾并处理来自后端代码的值。
    【解决方案2】:

    是的,你可以;附加一个随机忽略的参数是一种经典的方法来阻止缓存。 您还可以使用标题:Cache-control: no-cacheExpires: 设置真的很早。

    【讨论】:

    • 对于那些想要相信缓存控制标头的人来说,仅供参考:它们可能不会一直工作。缓存控制标头只是对浏览器的建议。此外,代理最终可以决定在浏览器发出请求后向浏览器发送什么。
    猜你喜欢
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 2018-02-21
    • 1970-01-01
    • 2019-11-13
    • 2019-07-05
    相关资源
    最近更新 更多