首页 > 解决方案 > 如何确保以前的访问者看不到旧的 HTML 页面?

问题描述

我看到很多关于强制缓存重新加载的答案,推荐了一个包含 HTML 页面本身的解决方案。

但是,当您的旧网站被编写为index.html主页时,现在您将其替换为新内容,您如何确保回访者看到新内容?

旧网站曾经index.html作为索引页面(在nginx's 配置中),我现在已更改为index.php. 但是每当我从以前访问过它的浏览器访问它时,它仍然会打开缓存的旧index.html页面。新的浏览器将index.php正确加载。

我发现的一个看似正确的答案是告诉为该部分nginx设置,这将强制缓存无效;但由于某种原因,这不起作用。expires -1;server {}

当然,需要发生的是访问者将始终获得新页面,而无需自己明确发出刷新。

据推测,解决方案应该是通过标头使缓存无效。但是怎么做?

编辑以解决所有建议的评论和答案

  1. 就像我在回答的第一段中所说的那样,这个问题不是通过编辑索引文件来解决的(比如为“缓存清除”添加参数),因为索引文件本身已经被缓存了,这就是问题所在。
  2. 我的问题中没有提到 javascript 或 CSS 文件。同样,它是index.html已缓存的文件。
  3. 存在index.htmlindex.php不会产生冲突。index.html整个系统工作正常,只有在服务器配置中设置为索引页面时,之前访问过该页面的老访问者,index.html即使在索引更改为index.php. 这也很容易证明,即使在index.html文件被完全删除后,这个问题仍然存在。因为一旦浏览器缓存了一个 HTML 文件,它就不再向服务器询问索引文件是什么,它只是显示它缓存的内容。

所以完整的场景是这样的:

  1. 该网站已index.html在服务器配置中设置为索引页面
  2. 浏览器访问网站
  3. 浏览器缓存主页
  4. 服务器配置中的索引页面更改为index.php
  5. 同一个浏览器访问网站
  6. index.html浏览器显示从以前缓存

在数字 5. 中,如果我用新的浏览器访问该网站,它将显示位于 中的新主页的内容index.php。所以问题是,我如何让旧浏览器忘记它缓存的内容,并加载新的主页?

标签: htmlnginxcache-controlcache-invalidation

解决方案


如果我正确理解了您的问题,我相信您正在寻找的是一种叫做cache busting的东西。这意味着,您实际上是在相关的 CSS / JS 文件中添加了一个幻象/幽灵字符串。相关,我的意思是您希望随着时间的推移对其进行更改的文件。

请记住,缓存对用户来说是一项健康的功能,因为一旦用户加载了一次内容,它就会使您的网站更快。因此,您应该仔细考虑要将缓存清除添加到哪些文件。外汇。无需将缓存清除添加到您将来不会对其进行更改的静态库中。

缓存破坏的示例如下:

<script src="/js/example.js<?php echo '?'.date('Y-m-d H:i:s'); ?>" type="text/javascript"></script>

<link href="/css/example.css<?php echo '?'.date('Y-m-d H:i:s'); ?>" rel="stylesheet">

您将在这里注意到的是,我将 PHP 日期函数连接到我的 JS 和 CSS 示例。日期功能打印当前日期、小时、分钟和秒。换句话说,它一直在改变它的名字,直到第二个。因此,浏览器不可能保留文件的缓存版本,因为从技术上讲,它们在每一秒过去后都不是同一个文件。

如果这不是您想要的,具体来说,请告诉我,我会编辑我的答案。

您的问题也可能与此处已解决和回答的问题类似。


推荐阅读