【问题标题】:Why aren't my users seeing the latest updates when I release a new version of our website?当我发布我们网站的新版本时,为什么我的用户看不到最新更新?
【发布时间】:2009-11-03 18:36:33
【问题描述】:

上周四,我们刚刚发布了我们网站的新版本。最大的变化是我们从 Prototype 转换为 jQuery。这当然包括对引用的 javascript 文件的大量更改。也有新的 css 文件更改。不幸的是,我们的许多客户都没有看到这些变化。我什至让一位客户清除了他们的浏览器缓存,按 F5 并直接下载 js 文件。他仍然得到旧版本。

我们有什么方法可以通知所有参与者(浏览器、代理服务器等)我们的文件发生了变化?

顺便说一句,我们的许多客户都是财富 500 强公司。他们使用 IE 6 并且通常位于代理服务器后面。

我们使用 Tomcat 6 和 Apache 2。

【问题讨论】:

  • 未更改的内容是由 Tomcat 还是 Apache2 提供的?
  • 代理服务器有可能缓存内容吗?

标签: apache deployment tomcat caching


【解决方案1】:

我注意到 StackOverflow 在他们的文件中使用版本号

http://sstatic.net/so/js/question.js?v=5207

所以我在我们的网站上尝试了这个,它似乎工作正常。一位使用特别顽固的浏览器的用户在更改后立即看到了结果。

我喜欢这个的一点是,它对我们来说实现起来并不难,它仍然允许浏览器和代理缓存没有太大变化的文件。

【讨论】:

  • 为了更灵活的变化,只需将脚本文件的 Unix 上次修改时间戳附加到源属性,例如"script.js?NNNNNNNNNNNNNNN" 会这样做,这意味着每当文件更改时都会发生缓存未命中。当然,在生产中,这会在新版本发布时发生。
【解决方案2】:

对于 Tomcat,在部署时请确保在重新启动之前删除 work/Catalina/localhost 目录中的所有内容。这是tomcat的缓存目录。此外,如 me_here 所述,在您的 servlet/JSP 中添加标头可能会有所帮助。

【讨论】:

  • 我总是在发布时删除工作目录。大多数用户都看到了正确的文件,所以我知道它不可能是工作目录。
【解决方案3】:

如果代理服务器正在缓存您的网站,那么您几乎无能为力。您可以尝试将CACHE-CONTROL 和PRAGMA:NO-CACHE 标头添加到您的页面。

您还应该尝试在您和服务器之间尽可能少地复制问题。我在 Tomcat 保留其“工作”缓存中的文件时遇到了问题,因此请务必将其删除。

【讨论】:

  • 我们实际上遇到了代理服务器保留我们的 html 文件的问题。但我添加了 ServletActionContext.getResponse().setHeader("Cache-Control", "private, max-age=0");到拦截器。这解决了服务器缓存这些文件的问题。但是js、css和图片有时还是会被缓存。
【解决方案4】:

我遇到了类似的问题。最后,我通过在每个页面上发送 http 标头来“解决”它,说明内容已过期并强制更新页面。虽然不是一个非常优雅的解决方案。

在 PHP 中是:

header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past

但不确定 Tomcat。

【讨论】:

  • 问题是关于 Tomcat 的设置,所以 PHP 不是很相关,但 HTTP 标头值也可以在 Java 中设置。
猜你喜欢
  • 2018-08-12
  • 1970-01-01
  • 2020-12-23
  • 2010-12-10
  • 1970-01-01
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
相关资源
最近更新 更多