1

我有一个在 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)缓存这些动态加载的本地文件?

4

1 回答 1

3

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

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

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

ApacheHeader指令易于使用,您几乎可以在 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>
于 2013-01-17T19:11:12.433 回答