如何强制浏览器刷新网页的缓存版本
Posted
技术标签:
【中文标题】如何强制浏览器刷新网页的缓存版本【英文标题】:How to force a browser to refresh a cached version of a webpage 【发布时间】:2010-11-15 12:03:37 【问题描述】:我有一个网站,由于 apache conf 文件准备不当,已指示用户在未来几年缓存网站 URL。因此,当一个人访问该站点时,他们通常甚至不会尝试请求该页面。浏览器只是从缓存中加载 html。
本网站即将进行重大更新,希望用户能够看到。我有没有办法强迫用户实际重新请求网页?我担心对于一些用户来说,除非他们碰巧按了 F5,否则他们可能会看到几年的旧网页。
【问题讨论】:
【参考方案1】:使用不同的网址。如果您网站的主要入口点(如主索引文件)被缓存,那么您就完蛋了……也许您应该注册另一个域名?
【讨论】:
网站在搜索引擎中排名靠前;在我们的 SEO 惩罚案例库中,不同的 url 不起作用 您可以通过添加 URL 参数(如时间戳)使其成为不同的 URL:?new=有几种方法可以实现这一点 第一的 在该部分添加元标记:
<meta http-equiv="pragma" content="no-cache" />
基本上浏览器不会缓存页面。
另一个选项是设置会话,这将强制浏览器每次进入一个新会话,从而使浏览器从服务器而不是缓存中获取页面
<?php
session_start();
$_SESSION = array();
session_destroy();
?>
您可以将其添加到您的网站几天,然后再删除。 我真的不知道它是否有用,但也许你会发现它很有用
【讨论】:
如果浏览器缓存了页面,它永远不会访问服务器,所以这根本没有帮助。 是的,我刚刚试了一下,但没有成功。不过感谢您的想法。 Drat - 我以为你有它。我有一个文件sdsolarblog.com/montage/show.html 一直在变化,以显示带有标题的最新文件。 (现在最新的文件是sdsolarblog.com/2017-10-15.jpg)即使我清除了 Chrome 的缓存,它也会一直显示昨天的版本。【参考方案3】:有争议的是,如果您的“重大更新”只是在几周(2 或 3)周内,您只需要现在重新配置您的 apache conf(对于 html 没有遥远的未来的东西 - 仅适用于最适合的资产和内容可能永远不会改变)。默认情况下,Firefox 缓存约为 50MB,这并不多,因为图像也会被缓存,而且现代网站有很多内容。
不完美 - 但我会这样做 - 当我不想或无法更改 URL 时 ;)
【讨论】:
这就是我希望发生的事情。几周前我更新了 apache conf 以删除缓存。看来真的没有办法强制刷新。【参考方案4】:我意识到这个问题已经很老了,但我有一个可行的答案:
当然,您可以强制新 URL 避免常见缓存(不是长期缓存)...
即
向静态 .js/.css/.html 文件添加查询 为无缓存添加元编译指示标签 服务器端重定向、无缓存、消除 cookie、会话等但是在这种情况下(以前为长时间缓存而编辑的 apache .conf),由于您无法出于 SEO 目的更改域,因此可以使用“粗略的技巧”来最大限度地减少对 SEO 的影响:
将您的索引页面(即 index.php)复制到新页面(即 index_new.php)并编辑 httpd.conf(或等效项),以使 DirectoryIndex 成为新页面。然后只需删除或移动您的旧页面,理论上它应该始终重定向到新页面。
即在 Debian/Ubuntu 中:
cd /var/www
cp index.php index_new.php
sudo vim /etc/apache2/sites-enabled/000-default
<Directory /var/www/>
...
DirectoryIndex index_new.php
</Directory>
mv index.php index_old.php
sudo service apache2 restart
你去吧。
【讨论】:
【参考方案5】:晚了好几年,但它可能对未来的人有所帮助:如果你有 任何 javascript 文件在未来几年没有被缓存(即如果你有任何运行新 js 的方法在缓存的站点上),添加一些将以编程方式清除缓存的js。修复配置和/或更新完成后,删除缓存清除 js。
Ctrl + F5 in jquery to clear browser cache
【讨论】:
【参考方案6】:我认为没有办法做到这一点。如果他们从不联系您的服务器,那么您真的无能为力。
【讨论】:
【参考方案7】:您可以在 HTML 文件中进行所有必要的更改,例如
<meta http-equiv="cache-control" content="no-cache, must-revalidate, post-check=0, pre-check=0" />
<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
<meta http-equiv="pragma" content="no-cache" />
另外,你可以明确告诉 Apache 使用 mod_expires.c 模块,并在 httpd.conf 文件中添加几个指令:
<IfModule mod_expires.c>
# Turn on the module.
ExpiresActive on
# Set the default expiry times.
ExpiresByType text/html "modification plus 5 seconds"
ExpiresByType text/javascript "modification plus 5 seconds"
ExpiresDefault "access plus 2 days"
</IfModule>
通过这种方式,您可以将 http 标头缓存控制和过期添加到响应中,以便浏览器在原始文件被修改 5 秒后更新缓存,对于那些类型的文件,以及被修改后的 2 天浏览器可以访问所有其他类型的文件。
希望这会有所帮助。
【讨论】:
【参考方案8】:更改每个资源的 URL
【讨论】:
【参考方案9】:浏览器正在使用缓存来优化对服务器的调用,在构建产品的任何更新的情况下,您必须强制浏览器从服务器刷新资源,就像使用 f5 清除缓存一样。
解决方案您应该向元包含(URL)添加一些参数,因为浏览器不会使用此类参数在缓存中找到资源,因此它将从服务器刷新它们。
您可以为每个版本设置参数,例如如下所示:
<script src="assets/js/customscript.js?v=1.1"></script>
<link rel="stylesheet" type="text/css" href="assets/style/main.css?v=1.1"></link>
【讨论】:
以上是关于如何强制浏览器刷新网页的缓存版本的主要内容,如果未能解决你的问题,请参考以下文章