部署后强制缓存刷新

2022-08-30 19:53:19

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

这是我的情况:

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

有什么想法吗?Htaccess?新旧调用的PHP API?page.html

谢谢!


答案 1

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

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

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

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等等,但坦率地说,如果页面已经缓存,我认为这不会帮助你。


更新

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

如果既没有缓存验证程序,也没有与响应关联的显式过期时间,则我们不希望缓存它,但某些缓存可能会违反此期望(例如,当几乎没有或没有可用的网络连接时)。


答案 2

也许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.
?>

页.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>

推荐