正在删除网站的所有缓存页面
Deleting all cached page of the site
场景
移动和桌面版本
我正在开发一个具有桌面和移动版本的网站:如果用户愿意,可以选择切换版本:javascript将保存一个cookie,告诉所需的版本,并将重新加载页面,并在其url后面附加值"?nocache=1"
页面缓存
页面使用以下PHP代码缓存:
<?php
$lastModified=filemtime(__FILE__);
$etagFile = md5_file(__FILE__);
if(empty($_GET['nocache'])){
$ifModifiedSince=(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] : false);
$etagHeader=(isset($_SERVER['HTTP_IF_NONE_MATCH']) ? trim($_SERVER['HTTP_IF_NONE_MATCH']) : false);
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $lastModified)." GMT");
header("Etag: $etagFile");
header('Cache-Control: public');
if (strtotime($ifModifiedSince)==$lastModified || $etagHeader == $etagFile){
header("HTTP/1.1 304 Not Modified");
exit;
}
}
?>
问题
如果用户更改了网站的版本,则缓存的PHP代码中的初始条件将导致浏览器再次从服务器加载页面,但所有其他页面都将保持缓存状态。
我的问题
如果网站的所需版本发生了更改,我有没有办法再次加载所有页面?
回答
在PHP中编写一个JavaScript变量,其中包含生成的页面的版本(桌面或移动)。类似于:echo "var pageVersion = $desktopOrMobile;";
然后在页面加载时添加一个JavaScript,用于比较此变量和cookie。如果他们匹配,一切都很好。如果没有,你必须重新加载页面。(类似于:window.location.href = window.location.href + '?nocache=1';
)
如果你想在同一浏览器的所有选项卡和窗口中更改版本,你甚至可以定期(每隔一秒左右)进行检查。
免责声明
我不得不承认,我自己还没有尝试过,但我确信这个概念会奏效。
另一种方法是以PHP可以读取的方式存储缓存中的版本:要么必须在每个URL上附加一个GET变量(如?version=mobile
),要么将该信息插入URL本身(如example.net/mobile/foo/bar
或mobile.example.net/foo/bar
)。通过这种方式,PHP可以将缓存中的版本与cookie中所需的版本进行比较,并将请求重定向到所需的URL。
这种解决方案不需要";nocache破解";并且可以在没有JavaScript的情况下完成,但我相信这将是更多的工作,因为你必须重写所有链接以包含版本,或者使用一些URL重写,这可能会破坏与其他资源的链接。因此,我推荐上述答案。
如果需要,我会很乐意给出进一步的指示和/或改进我的答案。
旁注
在我看来,你在这里做了一些非常激进的缓存。您这样做可能有充分的理由,但如果您开始通过require
从数据库加载数据或包括其他PHP文件,可能会给您带来很多麻烦,因为您的缓存算法不会注意到这些额外的资源是否已经更改。
很抱歉,我无法从你的问题中准确说出你在找什么。但是,如果您想确保重新加载页面,有一个非常简单的方法。这是我一直使用的一个,因为Chrome似乎喜欢缓存页面,即使它们已经更改!
在URL末尾添加类似"…?do_reload="+Date.now()的内容。由于Date.now()总是与上次加载文件时不同,浏览器将清除缓存并从服务器重新加载文件。
理论上,如果你只想在发生变化时重新加载,你可以将其设为VAR,并将值设置为false(不重新加载-再次假设这是过去设置的)或Date.now(),如果你确实想清除缓存并重新加载。
老实说,没有比这更容易的了。我花了太多时间搞砸了,在另一个网站上看到了这个答案。希望这对你有帮助!
PhilMDev
- 正在删除网站的所有缓存页面
- 如何删除谷歌脚本中的谷歌缓存
- Openfire 会在一天后删除 pub sub 节点(而不是在服务器重新启动或删除缓存后)
- 如何缓存$http但也能够在angularjs中删除
- 如何删除悬停项目上的 jquery 缓存
- 如何从浏览器缓存中删除图像
- 以编程方式删除回发时的浏览器缓存
- 通过AJAX发布画布blob:阻止/删除本地缓存
- Javascript:检测是否缓存了请求的文件,如果存在较新版本,则删除缓存
- 如何删除有角度的$modal缓存
- 在服务调用后删除缓存
- 删除chrome v8 javascript引擎函数缓存
- 如何在angularjs中删除缓存
- 如何使用PHP或Javascript删除Microsoft Edge's缓存
- 用javascript删除缓存
- ExtJs删除和添加监听器.缓存的问题
- 当访问者转到特定页面时,从缓存中删除我的站点
- 如何真正删除陨星的Minimongo /本地缓存
- 如何告诉浏览器从缓存中删除文件并获取新部署的文件
- 是否有可能阻止/删除任何由dojo.require声明的缓存脚本?