如何强制浏览器刷新网页的缓存版本

时间:2009-07-30 15:45:28

标签: apache caching

我有一个网站,由于准备不足的apache conf文件指示用户在未来几年内缓存网站URL。因此,当某人访问该网站时,他们通常不会尝试甚至请求该网页。浏览器只是从缓存加载HTML。

该网站即将获得重大更新,我希望用户能够看到它。有没有办法强迫用户实际重新请求网页?我担心对于一些用户来说,除非碰巧按F5,否则他们可能会看到旧网页好几年了。

9 个答案:

答案 0 :(得分:18)

使用不同的网址。如果你的网站的主要入口点(如主索引文件)被缓存,那你就搞砸了...也许你应该注册另一个域名?

答案 1 :(得分:5)

有几种方法可以实现这一目标 第一 在添加元标记的部分中:

<meta http-equiv="pragma" content="no-cache" />

基本上浏览器不会缓存页面。

另一种选择是设置会话,这会在每次访问时强制浏览器进入新会话,从而使浏览器从服务器而不是缓存中获取页面

<?php
session_start();

$_SESSION = array();
session_destroy();

?> 

您可以将此添加到您的网站几天,然后删除。 我真的不知道它是否会这样做,但也许你会发现它很有用

答案 2 :(得分:4)

有争议的是,如果您的“主要更新”仅在几周(2或3周)内,您只需要现在重新配置您的apache conf(html的未来很远 - 仅适用于最重要的资产和内容)可能永远不会改变)。 Firefox缓存默认约为50MB,这并不多,因为图像也被缓存,现代网站有很多内容。

不完美 - 但这就是我要做的事 - 当我不想或不能改变URL的时候;)

答案 3 :(得分:2)

我认为没有办法做到这一点。如果他们从不联系你的服务器那么你真的无能为力。

答案 4 :(得分:1)

更改每个资源的网址

答案 5 :(得分:1)

我意识到这个问题很老了,但我有一个可行的答案:

当然你可以强制新的URL来避免常见的缓存(不是长期缓存)......

  • 向静态.js / .css / .html文件添加查询
  • 为no-cache添加meta pragma标记
  • 服务器端重定向,无缓存,消除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

然后你去。

答案 6 :(得分:1)

已经很晚了,但它可能有助于有人在路上:如果您已经任何 javascript文件未经过多年的缓存(即如果您有任何方法)在缓存的网站上运行新的js,添加一些以编程方式清除缓存的js。修复配置和/或完成更新后,删除缓存清除js。

Ctrl + F5 in jquery to clear browser cache

答案 7 :(得分:0)

您可以在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头缓存控件和expires添加到响应中,以便浏览器在源文件中修改文件后5秒更新缓存,对于这些类型的文件,以及浏览器访问所有其他类型的文件。

希望这有帮助。

答案 8 :(得分:0)

浏览器正在使用高速缓存来优化对服务器的调用,如果对构建产品进行任何更新,则必须强制浏览器从服务器刷新资源,就像使用f5清除高速缓存一样。

针对该解决方案,您应该通过以下方式向Meta-includes(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>