【问题标题】:Force cache refresh after deployment部署后强制刷新缓存
【发布时间】:2012-01-20 06:12:12
【问题描述】:

如果您无法更改引用该文件的 URI(例如,无法添加时间戳参数),是否有办法强制客户端的缓存重新加载 HTML 文件?

这是我的情况:

  • 一个部署到 1000 个用户的插件
  • 该插件加载example.com/page.html,它调用script.js
  • 资源 URI example.com/page.html 无法更改(无插件更新)
  • page.html 已更改。我需要从用户缓存中清除旧的page.html,以便加载新的page.html

有什么想法吗?访问?新旧page.html调用的PHP API?

谢谢!

【问题讨论】:

    标签: php .htaccess uri cache-control


    【解决方案1】:

    好吧,如果页面已经被浏览器缓存,很难告诉它不要使用它的缓存版本,因为它可能不会在确定它的缓存版本过时之前再次检查。您只需向所有用户发送一封蜗牛邮件,通知他们按 ctrl+f5 :)

    浏览器有可能在提供缓存版本之前至少尝试一个 HEAD 请求来检查修改后的时间戳。在这种情况下,以下内容将为您提供帮助。

    浏览器使用 HTTP 标准标头从您的 Web 服务器协商其内容。今后,如果您想告诉浏览器不要缓存文件,您必须发送适当的 HTTP 标头。如果您想在 PHP 中执行此操作,您可以使用 header 函数将适当的 HTTP 标头发送到浏览器:

    header('Cache-Control: no-cache');
    header('Pragma: no-cache');
    

    如果必须通过 HTML 完成,您可以在页眉中执行以下操作:

    <meta http-equiv="Expires" content="Tue, 01 Jan 1995 12:12:12 GMT">
    <meta http-equiv="Pragma" content="no-cache">
    

    但是,您无法确定浏览器是否会满足您的请求,即它不缓存页面。还有一些其他的东西,比如 eTags 和诸如此类的东西,但坦率地说,如果页面已经被缓存,我认为这对你没有帮助。


    更新

    来自Response Cacheability 上的 HTTP/1.1 规范:

    如果既没有缓存验证器也没有明确的过期时间 与响应相关联,我们不希望它被缓存,但是 某些缓存可能会违反这种期望(例如,当很少 或没有可用的网络连接)。

    【讨论】:

    • 不确定这是否能实现我的目标。我控制的 PHP 文件是一个由来自example.html 的 js 文件调用的 API。您提供的header 解决方案似乎只适用于 php 文件本身?或者它是否适用于同一域上的所有资源?至于 HTML 解决方案,如果旧的 example.html 文件已经包含这些标签,则该解决方案有效,但如上所述,我的情况并非如此。
    • 否则,我正在尝试在已缓存的旧 example.html 上加载新的 example.html
    • 遗憾的是,一旦浏览器缓存了某些内容,您就无能为力了。好消息是大多数浏览器不会长时间缓存内容。恐怕只是生活中的事实。
    • PHP API 可能是一厢情愿的想法,但您会认为可以在 Apache 级别强制刷新。无论如何,HTML 没有被长时间缓存是一种解脱。如果没有人有任何奇迹般的解决方案,我将不理会它并接受您的回答。
    • 是的,我无法想象浏览器缓存超过一天(最多)的任何内容,至少不检查服务器以查看文件是否已被修改。不过,我认为通常会花费一两个小时,除非您的服务器明确告知他们将其缓存更长时间。
    【解决方案2】:

    也许 PHP 可用于向 javascript 调用添加时间戳。然后你可以运行这个持续时间............例如:

    check_if_cache_should_be_disabled.php

    <?php
    $deployment_flag = true; // Uncomment this if you want to disable normal cache.
    //$deployment_flag = false // Uncomment this if you want to enable normal cache.
    ?>
    

    page.php

    <script src="/js/script.js<?php 
    require('check_if_cache_should_be_disabled.php');
    //  File Get Contents can be used for a remote server
    //file_get_contents('http://yourserver.com/check_if_cache_should_be_disabled.php');
    if ($deployment_flag == true) {
    print ( '?ts='.date() );
    }
    ?>"></script>
    

    【讨论】:

      【解决方案3】:

      您可以更改文件名,例如 page_v2.html,这将使浏览器将页面加载为新页面。

      【讨论】:

      • 我发现即使这对 Chrome 也没有帮助。它会愉快地继续加载甚至不存在的文件。
      • @nuander 确实如此。 Firefox 有时甚至可以使用 ? 来获取诸如 css 和 js 之类的资源,但 Chrome 似乎更糟。由于行为似乎不一致,有时可能会令人毛骨悚然。
      • 我见过使用 .php 文件来提供 css 和 js 资源的网页。我猜是这样可以发送标头以强制重新加载,例如 Cache-Control: no-store, max-age=0
      猜你喜欢
      • 1970-01-01
      • 2020-09-17
      • 2011-09-10
      • 1970-01-01
      • 2017-09-08
      • 1970-01-01
      • 2011-04-21
      • 2016-05-18
      • 1970-01-01
      相关资源
      最近更新 更多