如果未由应用程序设置,请添加Apache标头

时间:2012-01-06 15:55:15

标签: php apache

我正在尝试控制某个目录中文件的缓存。我希望默认缓存时间为15分钟,但我想让应用程序在必要时更改它。例如,我可能有一个PHP脚本,我想每1分钟刷新一次,所以我将在PHP中为该脚本设置缓存控制头。但对于所有其他文件,我只想将缓存时间设置为15分钟,其中一些是静态文件,因此我不能只在PHP中设置默认缓存时间。

我目前在我的Apache配置中有这个:

<Directory />
    Options FollowSymLinks
    AllowOverride None
    Header set Cache-Control "max-age=900"
</Directory>

这对于99%的情况非常有用,我只需要15分钟的缓存。但是,如果我的PHP脚本设置了缓存控制标头,则此设置将覆盖它。

我查看了mod_header的文档,没有任何设置(unset,add,append等)似乎给了我我需要的东西。

提前致谢。

2 个答案:

答案 0 :(得分:1)

根据php手册

<?php
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
?>

通过发送上面的标题,您应该覆盖任何可能导致脚本输出被缓存的设置。

答案 1 :(得分:1)

请看一下mod_expires而不是http://httpd.apache.org/docs/2.2/mod/mod_expires.html。文档说它不会覆盖PHP脚本创建的标题:

  

“当Expires标头已经是生成的响应的一部分时   服务器,例如,当由CGI脚本生成或代理时   原始服务器,此模块不会更改或添加Expires或   Cache-Control标题。“

以下是mod_expires的示例配置:

 <IfModule mod_expires.c>
     ExpiresActive on
     ExpiresDefault A600
     ExpiresByType image/gif "access plus 1 day"
     ExpiresByType image/jpeg "access plus 1 day"
     ExpiresByType image/png "access plus 1 day"
     ExpiresByType image/x-icon "access plus 1 day"
     <FilesMatch "\.(php|php4)$">
         ExpiresByType text/html "now"
     </FilesMatch> 
 </IfModule>

取自http://howto.gumph.org/content/reduce-webserver-bandwidth/

祝你好运!