html - 如何确保以前的访问者看不到旧的 HTML 页面?
问题描述
我看到很多关于强制缓存重新加载的答案,推荐了一个包含 HTML 页面本身的解决方案。
但是,当您的旧网站被编写为index.html
主页时,现在您将其替换为新内容,您如何确保回访者看到新内容?
旧网站曾经index.html
作为索引页面(在nginx
's 配置中),我现在已更改为index.php
. 但是每当我从以前访问过它的浏览器访问它时,它仍然会打开缓存的旧index.html
页面。新的浏览器将index.php
正确加载。
我发现的一个看似正确的答案是告诉为该部分nginx
设置,这将强制缓存无效;但由于某种原因,这不起作用。expires -1;
server {}
当然,需要发生的是访问者将始终获得新页面,而无需自己明确发出刷新。
据推测,解决方案应该是通过标头使缓存无效。但是怎么做?
编辑以解决所有建议的评论和答案
- 就像我在回答的第一段中所说的那样,这个问题不是通过编辑索引文件来解决的(比如为“缓存清除”添加参数),因为索引文件本身已经被缓存了,这就是问题所在。
- 我的问题中没有提到 javascript 或 CSS 文件。同样,它是
index.html
已缓存的文件。 - 存在
index.html
并index.php
不会产生冲突。index.html
整个系统工作正常,只有在服务器配置中设置为索引页面时,之前访问过该页面的老访问者,index.html
即使在索引更改为index.php
. 这也很容易证明,即使在index.html
文件被完全删除后,这个问题仍然存在。因为一旦浏览器缓存了一个 HTML 文件,它就不再向服务器询问索引文件是什么,它只是显示它缓存的内容。
所以完整的场景是这样的:
- 该网站已
index.html
在服务器配置中设置为索引页面 - 浏览器访问网站
- 浏览器缓存主页
- 服务器配置中的索引页面更改为
index.php
- 同一个浏览器访问网站
index.html
浏览器显示从以前缓存
在数字 5. 中,如果我用新的浏览器访问该网站,它将显示位于 中的新主页的内容index.php
。所以问题是,我如何让旧浏览器忘记它缓存的内容,并加载新的主页?
解决方案
如果我正确理解了您的问题,我相信您正在寻找的是一种叫做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 示例。日期功能打印当前日期、小时、分钟和秒。换句话说,它一直在改变它的名字,直到第二个。因此,浏览器不可能保留文件的缓存版本,因为从技术上讲,它们在每一秒过去后都不是同一个文件。
如果这不是您想要的,具体来说,请告诉我,我会编辑我的答案。
您的问题也可能与此处已解决和回答的问题类似。
推荐阅读
- authentication - 登录表单:先询问电子邮件有什么好处?
- javascript - 当我单击锚点时,网站的菜单不会消失
- javascript - 在javascript中将二进制数据保存到文件
- javascript - 使用伪类从父元素遍历到第一个子元素未按预期工作
- vba - 格式化 MeetingItem 开始日期和结束日期
- json - Flutter 将 json 作为字节发送到 websocket 服务器?
- html - 使用谷歌翻译的默认翻译语言
- java - 使用条件转换 HashMap 中的流
- javascript - Javascript .forEach() 不适用于 DOM 节点,因为它们在过程中会发生变化
- sql - 如何从 SQL Server 中恢复已删除的数据?