本地LAMP堆栈,阻止PHP缓存动态加载的页面

时间:2013-01-17 19:03:43

标签: php apache http-headers

我在Linux上运行了本地LAMP堆栈。我有通常的Apache / PHP / mySQL东西,一切都可以在localhost中正常工作。

我在服务器上有一个显示树视图的小应用程序。这列出了一系列在本地(在服务器上)找到的文档。可以通过在树中单击这些文件来查看这些文件,然后将它们加载到页面上的DIV中。可以使用我在应用程序中编写的简单编辑器编辑这些文件。到目前为止,此工作正常。

问题是PHP(我假设)在加载时缓存这些文档,这意味着当用户编辑它们时,虽然它们被保存,但当它们在树中重新选择时,会显示缓存版本,并且不是新编辑的版本。

该应用程序的初始页面是一个标准的HTML页面,但我已将其重命名为PHP并将以下代码添加到此页面的顶部:

<?php
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
?>

不幸的是,虽然这似乎阻止了主页面的缓存,但它并不能阻止那些在应用程序的一般使用过程中动态加载的文件。

有什么方法可以阻止PHP(仍然假设它是PHP)缓存这些动态加载的本地文件?

1 个答案:

答案 0 :(得分:3)

你正在混淆操作码缓存和浏览器缓存。您设置的标头与PHP无关,它们是影响浏览器缓存的http标头。 PHP将(如果它与APC或类似设置正确)缓存操作码,这与您的问题无关。

当您将文件下载到客户端进行编辑时,必须在文件上设置缓存标头,以防止客户端(浏览器)缓存它们。

每次下载(css文件,js文件,无论文件)都是单独的http请求,因此有自己的标头集。因此,如果您设置自定义每个请求标头,则必须为每个此类请求设置它们。在您的情况下,更简单的解决方案是在Apache配置级别添加这些标头。

Apache Header directive易于使用,您几乎可以在Apache配置链的任何位置使用它。这意味着.htacess,vhost配置或一般apache配置。这取决于您和您的服务器环境,您如何解决这个问题。

如何为.htaccess添加标题的示例如下:

Header set Cache-control "max-age=0, no-store"

或者,如果您只想为某些文件类型设置某些标题:

<FilesMatch "\.(gif)$" >
    Header set Cache-control "max-age=0, no-store"
</FilesMatch>