删除站点的所有缓存页面

时间:2015-02-06 19:10:30

标签: php javascript cross-platform caching

方案

移动版和桌面版。
我正在开发一个带有桌面和移动版本的网站:用户可以选择切换版本,如果他们想:javascript将保存一个cookie告诉所需的版本,并将重新加载附加到其URL的页面值&#34 ;非缓存= 1&#34 ;.
页面缓存。
使用以下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代码中的初始条件将导致浏览器再次从服务器加载页面,但所有其他页面将保持缓存状态。

我的问题

如果更改了所需的网站版本,是否可以再次加载所有页面?

2 个答案:

答案 0 :(得分:2)

答案:

在PHP中编写一个JavaScript变量,其中包含生成页面的版本(桌面或移动设备)。类似于:echo "var pageVersion = $desktopOrMobile;";

然后在页面加载时添加一个JavaScript,用于比较此变量和cookie。如果匹配,一切都很好。如果他们没有,你必须重新加载页面。 (类似于:window.location.href = window.location.href + '?nocache=1';

如果您想要更改同一浏览器的所有标签页和窗口中的版本,您甚至可以定期(每隔一秒左右)进行此检查。

<强>声明:

我必须承认我自己没有尝试过,但我确信这个概念会起作用。

另一种方法是以某种方式存储哪个版本在缓存中,PHP可以读取它:要么必须将?version=mobile之类的GET变量附加到每个URL,要么将该信息插入到URL本身中example.net/mobile/foo/barmobile.example.net/foo/bar。这样,PHP可以将缓存中的版本与cookie中的所需版本进行比较,并将请求重定向到所需的URL。

这个解决方案并不需要&#34; nocache-hack&#34;并且可以在没有JavaScript的情况下完成,但我相信这将是更多的工作,因为你必须重写所有链接以包含版本或使用一些URL重写可能会破坏到其他资源的链接。因此,我建议上面的答案。

如果需要,我很乐意给出进一步的指示和/或改进我的答案。

旁注:

在我看来,你在这里做了一些非常积极的缓存。 您可能有充分的理由这样做,但如果您开始从数据库加载数据或通过require包含其他PHP文件,它可能会给您带来很多麻烦,因为您的缓存算法将不会注意到这些额外资源是否已更改。

答案 1 :(得分:0)

对不起,我无法确切地说出你在问题中找到了什么。但是,如果您想确保重新加载页面,那么这是一种非常简单的方法。这是我一直使用的那个,因为Chrome似乎喜欢让页面缓存,即使它们已经改变了!

在URL的末尾添加“...?do_reload =”+ Date.now()之类的内容。由于Date.now()将始终与上次加载文件的时间不同,因此浏览器将清除缓存并从服务器重新加载文件。

理论上,如果你想在某些事情发生变化时重新加载,你可以改为使用VAR,并将值设置为false(不再重新加载 - 再次假设已经过去设置过)或Date.now()你想要清除缓存并重新加载。

老实说,它没有比这更容易。我花了太多时间搞乱这个,并在另一个网站上看到了这个答案。希望这能帮到你!

PhilMDev