【问题标题】:Determining a page is outdated on github pages在 github 页面上确定页面已过时
【发布时间】:2012-11-01 16:30:59
【问题描述】:

Github pages 在所有提供的内容上设置非常激进的缓存标头(Cache-Control: max-age=86400 1 天,Expires 1 个月前)。

如果你更新你的页面并推送到 github,重新访问已经获得缓存副本的页面的人不会在没有实际清理浏览器缓存的情况下获得新页面。

在页面中运行的脚本如何确定它已过时并强制更新?

步骤可能是:

  1. 确定你在 github 页面上运行:easy,解析window.location 为github.com/
  2. 确定页面的当前版本:hard,git 不允许您将 sha1 嵌入提交的页面;没有 RCS $id$。那你怎么知道你是什么版本呢?
  3. 在github中获取当前版本; hard,github 摆脱了未经身份验证的 v2 API。推送到 github 和 github 也开始发布之间存在时间上的脱节。那么你怎么知道你能得到什么版本呢?
  4. 确定您已过时,如何使页面无效并强制重新加载? 困难,window.location.reload(true) 在 Safari/Chrome 中不起作用,例如...

所以它的解决这些步骤;当然可能还有其他方法?

【问题讨论】:

  • IIRC GitHub 仅对实际页面使用缓存,如果您通过普通存储库视图访问 gh-pages 存储库的代码,则不会。您也许可以设计一个从存储库加载文件的脚本(有可用的“原始”版本,现在只有代码额外的 HTML 和东西)。然后该文件应该包含 lastupdate 的时间戳。将该时间戳与通过实际页面发送的时间戳进行比较。如果不同,则强制重新加载。不过我可能在缓存上错了。
  • @clentfort 完全符合我的想象;我已经分解了问题中可能存在的步骤,更清楚地说明了障碍是什么
  • max-age=86400 不意味着提前 1 天(而不是提前 个月)?
  • @JBNizet 是的,缓存控制设置为提前 1 天,Expires 标头设置为 1 个月。
  • 我得到 一天 Expires 的所有标题。

标签: javascript github browser-cache


【解决方案1】:

为了更好地控制您网站的缓存,您可以使用 HTML5 缓存清单。见:

您可以使用window.applicationCache.swapCache() 更新您网站的缓存版本,而无需手动重新加载页面。

这是来自HTML5 Rocks 的代码示例,说明如何将用户更新到您网站的最新版本:

// Check if a new cache is available on page load.
window.addEventListener('load', function(e) {

  window.applicationCache.addEventListener('updateready', function(e) {
    if (window.applicationCache.status == window.applicationCache.UPDATEREADY) {
      // Browser downloaded a new app cache.
      // Swap it in and reload the page to get the new hotness.
      window.applicationCache.swapCache();
      if (confirm('A new version of this site is available. Load it?')) {
        window.location.reload();
      }
    } else {
      // Manifest didn't changed. Nothing new to server.
    }
  }, false);

}, false);

为避免一些混淆,我将添加 GitHub 为 cache.manifest 文件设置正确的 HTTP 标头:

Content-Type: text/cache-manifest
Cache-Control: max-age=0
Expires: [CURRENT TIME]

因此您的浏览器知道它是一个缓存清单,并且应该始终检查它是否有新版本。

【讨论】:

  • @IanKuca 你有没有实际测试过你说它没用?阅读 WHATWG 的离线 Web 应用程序,尤其是 6.7.4 Downloading or updating an application cache 和 6.7.5 The application cache selection algorithm 部分。据我了解,HTML5 Rocks 的代码应该可以工作。如果没有,请提供更多详细信息。谢谢。
  • @IanKuca 我很想听听为什么 做 OP 想要做的事情是没有用的,那就是强制更新一个陈旧的网站。您是说HTML5 Rocks 中的示例不起作用尽管与the spec 一致或应该理解第 6.7.4 和 6.7.5 节中的规范跟我理解的不一样?你没有回答。
  • @IanKuca GitHub 将缓存清单的 Expires 标头设置为 当前时间,更重要的是设置 Cache-Control 为 max-age=0 (max-age 指令总是覆盖 HTTP/1.1 中的 Expires 标头 - 请参阅 RFC 2616),因此它在交付时已经过期。无需控制清单标头,因为它们已经很好了,包括 Content-Type: text/cache-manifest
  • 哦,我的错。我认为所有非 HTML 文件的标题都是相同的。那么剧本就好了。对不起。
  • 为什么要在加载时而不是立即添加侦听器?
猜你喜欢
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
  • 2019-04-26
  • 2018-02-23
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
相关资源
最近更新 更多