部署后强制刷新缓存


Force cache refresh after deployment

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

这是我的情况:

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

有什么想法吗?Haccess?PHP API,旧的&新的page.html呼叫打开?

谢谢!

好吧,如果浏览器已经缓存了页面,很难告诉它不要使用缓存版本,因为在确定缓存版本过时之前,它可能不会再检查了。你只需要向所有用户发送一封蜗牛邮件,通知他们按下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">

但是,您无法确定浏览器是否会满足您的请求,即不缓存页面。还有一些其他的东西,比如电子标签之类的,但坦率地说,如果页面已经缓存,我认为这对你没有帮助。


更新

来自HTTP/1.1关于响应可缓存性的规范:

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

也许PHP可以用来为javascript调用添加时间戳。然后,您可以将其运行一段时间。。。。。。。。。。。例如:

check_if_cache_sshould_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>

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

这个答案可能过于简单,但您可以始终在包含文件版本的文件末尾附加一个GET值。现代浏览器通常将其作为新版本,并将忽略以前的缓存并获取最新的缓存。因此,当您希望缓存最新的代码时,您所要做的就是更新版本。

例如:

<script type="javascript" src="example.js?version=2.0.8"></script>

您甚至可以编写一个PHP脚本,当文件基于某些特定参数(如";上次更新"