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

Apache 如何强制浏览器刷新网页的缓存版本,apache,caching,Apache,Caching,我有一个网站,因为一个准备不充分的apacheconf文件已经指示用户在几年后缓存一个网站URL。因此,当一个人访问该站点时,他们通常甚至不尝试请求该页面。浏览器只是从缓存加载HTML 这个网站即将得到重大更新,我希望用户能够看到它。我有没有办法强迫用户实际重新请求该网页?我担心对于一些用户来说,除非他们碰巧按F5,否则他们可能会在几年内看到旧网页 我认为没有办法做到这一点。如果他们从未联系过你的服务器,你真的无能为力。使用不同的URL。如果你网站的主要入口点(如主索引文件)被缓存,那么你就完蛋

我有一个网站,因为一个准备不充分的apacheconf文件已经指示用户在几年后缓存一个网站URL。因此,当一个人访问该站点时,他们通常甚至不尝试请求该页面。浏览器只是从缓存加载HTML


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

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

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

有几种方法可以实现这一点 弗斯特 在“添加元标记”部分中:

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

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

另一个选项是设置会话,这将迫使浏览器每次进入新会话,从而使浏览器从服务器而不是缓存获取页面

<?php
session_start();

$_SESSION = array();
session_destroy();

?> 

您可以将其添加到您的网站几天,然后删除。
我真的不知道它是否有用,但也许你会发现更改每种资源的URL很有用。如果你的“主要更新”仅仅在几周内(2或3周),那么你现在只需要重新配置apache配置文件(对于html来说没有太远的将来的东西-只针对最有可能永远不会更改的资产和内容)。Firefox的缓存默认为~50MB,这并不多,因为图像也会被缓存,而现代网站有很多内容


不完美-但当我不想或无法更改URL时,我会这么做;)

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

当然,您可以强制新的URL以避免普通缓存(而不是长期缓存)

  • 向static.js/.css/.html文件添加查询
  • 为无缓存添加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
cd/var/www
cp index.php index_new.php
sudo vim/etc/apache2/sites enabled/000默认值
...
DirectoryIndex_new.php
mv index.php index_old.php
sudo服务apache2重启

好了。

已经晚了几年,但这可能会对以后的人有所帮助:如果你有任何javascript文件在几年后没有被缓存(也就是说,如果你有办法在缓存的站点上运行新的js),添加一些js,通过编程清除缓存。配置修复和/或更新完成后,删除缓存


您可以在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>

#打开模块。
过期于
#设置默认到期时间。
ExpiresByType text/html“修改加5秒”
ExpiresByType文本/javascript“修改加5秒”
ExpiresDefault“访问加2天”
通过这种方式,您可以将http headers缓存控件和expires添加到响应中,以便浏览器在源文件中修改该文件5秒后,以及在浏览器访问所有其他类型的文件2天后,更新缓存


希望这会有所帮助。

浏览器正在使用缓存优化对服务器的调用,在生成产品进行任何更新的情况下,您必须强制浏览器从服务器刷新资源,就像使用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>


如果浏览器缓存了该页面,它将永远不会命中服务器,因此这根本没有任何帮助。是的,我只是尝试了一下,但没有成功。谢谢你的主意。真糟糕,我还以为你有呢。我有一个文件,不断变化,以显示最新的文件与标题。(目前最新的文件是)即使我清除了Chrome的缓存,它也会不断显示昨天的版本;不同的url在我们的SEO处罚案例库中不起作用。您可以通过添加url参数使其成为不同的url,如时间戳:?new=。这不会搞砸搜索引擎优化。这是我希望会发生的事情。几周前,我更新了apacheconf以删除缓存。似乎真的没有办法强迫刷新。