部署后强制缓存刷新

时间:2012-01-20 06:12:12

标签: php .htaccess uri cache-control

如果您无法更改引用该文件的URI(例如,无法添加时间戳参数),是否有办法强制客户端缓存重新加载HTML文件?

这是我的情况:

  • 部署到1000个用户的插件
  • 该插件加载调用example.com/page.html
  • script.js
  • 无法更改资源URI example.com/page.html(无插件更新)
  • page.html已更改。我需要清除用户缓存中的旧page.html,以便加载新的page.html

有什么想法吗? htaccess的?旧的&新的page.html号召?

谢谢!

3 个答案:

答案 0 :(得分:29)

好吧,如果页面已被浏览器缓存,则很难告诉它不要使用其缓存版本,因为在确定其缓存版本过时之前,它可能不会再次检查。您只需向所有用户发送蜗牛邮件,通知他们按ctrl + f5:)

但是,浏览器有可能至少尝试使用HEAD请求来检查修改后的时间戳,然后再提供其缓存版本。在这种情况下,以下内容将帮助您。

浏览器使用HTTP标准标头从您的Web服务器协商其内容。如果您想告诉浏览器不要缓存文件,那么您必须发送相应的HTTP标头。如果您想在PHP中执行此操作,可以使用header函数将适当的HTTP标头发送到浏览器:

header('Cache-Control: no-cache');
header('Pragma: no-cache');

如果必须通过HTML完成,您可以在页眉中执行以下操作:

<meta http-equiv="Expires" content="Tue, 01 Jan 1995 12:12:12 GMT">
<meta http-equiv="Pragma" content="no-cache">

但是,您无法确定浏览器是否会遵守不缓存页面的请求。还有其他一些东西,比如eTags和诸如此类的东西,但坦率地说,如果页面已被缓存,我认为这不会帮助你。


<强>更新

来自Response Cacheability上的HTTP / 1.1规范:

  

如果既没有缓存验证器也没有明确的到期时间   与响应相关联,我们不期望它被缓存,但是   某些缓存可能会违反这种期望(例如,当很少时   或者没有可用的网络连接。)

答案 1 :(得分:4)

也许PHP可以用来为javascript调用添加时间戳。然后你可以运行这个持续时间...........例如:

  

check_if_cache_should_be_disabled.php

<?php
$deployment_flag = true; // Uncomment this if you want to disable normal cache.
//$deployment_flag = false // Uncomment this if you want to enable normal cache.
?>

  

page.php文件

<script src="/js/script.js<?php 
require('check_if_cache_should_be_disabled.php');
//  File Get Contents can be used for a remote server
//file_get_contents('http://yourserver.com/check_if_cache_should_be_disabled.php');
if ($deployment_flag == true) {
print ( '?ts='.date() );
}
?>"></script>

答案 2 :(得分:0)

您可以更改文件名,例如page_v2.html,这将使borwser将页面加载为新页面。