PHP缓存标头覆盖

时间:2012-09-02 19:51:01

标签: php cache-control

我在这里已经完成了100多个答案,很多可以尝试,没有工作?

拥有基于PHP的网站。我需要为所有.php文件缓存OFF,除了SELECT FEW。

所以,在.htaccess中,我有以下内容:

ExpiresActive On
# Eliminate caching for certain dynamic files
<FilesMatch "\.(php|cgi|pl)$">
ExpiresDefault A0
Header set Cache-Control "no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, no-transform"
Header set Pragma "no-cache"
</FilesMatch>

使用Firebug,我看到以下内容:

Cache-Control   no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, no-transform
Connection  Keep-Alive
Content-Type    text/html
Date    Sun, 02 Sep 2012 19:22:27 GMT
Expires Sun, 02 Sep 2012 19:22:27 GMT
Keep-Alive  timeout=3, max=100
Pragma  no-cache
Server  Apache
Transfer-Encoding   chunked
X-Powered-By    PHP/5.2.17
嘿,看起来很棒!

但是,我有几个.php页面,我需要一些非常短暂的缓存。

我认为简单的答案就是将这个添加到我希望启用缓存的每个php页面的顶部:

<?php header("Cache-Control: max-age=360"); ?>

不。

然后我尝试了上面的各种版本。不。

然后我尝试了meta http-equiv变体。不。

然后我尝试了.htaccess代码的变体以及上述变体,例如将其限制为:

# Eliminate caching for certain dynamic files
<FilesMatch "\.(php|cgi|pl)$">
Header set Cache-Control "no-cache, max-age=0"
</FilesMatch>

不。

我似乎没有做任何事情,只允许单个.php使用.htaccess代码启用缓存,而不是完全从.htaccess文件中删除语句。

我哪里错了?我需要做些什么才能让个别的php页面可以缓存,而其余的页面保持关闭状态?

感谢您的任何想法。

3 个答案:

答案 0 :(得分:2)

嗯,显然这没有答案。因此,此时我的解决方案是完全消除.htaccess代码,并将显式标头应用于每个文件。你知道什么是痛苦,但现在是时候继续前进了。如果有人有一个更优雅的解决方案,可以使用.htaccess默认值,请随时分享...谢谢

答案 1 :(得分:1)

所以我知道我迟到了......也许为时已晚。但我遇到了一个类似的问题,我想我会分享我的解决方案。

基本上,我为每个不想缓存的文件(或者缓存时间与静态资源不同)关闭了ExpiresActive Off。它看起来像这样:

ExpiresActive On

<FilesMatch "\.(php|cgi|pl)$">

  # This makes sure that no cache headers can be set,
  # but does not generate an error when trying to.
  ExpiresActive Off

</FilesMatch>

# Your normal caching here
ExpiresDefault "access plus 1 month"

现在,在您的PHP脚本中,您应该能够插入缓存标头,而不会被.htaccess文件覆盖,就像您正在做的那样

<?php header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 360) . ' GMT'); ?>

希望这有用。

答案 2 :(得分:1)

这个答案为我提供了解决方案:https://stackoverflow.com/a/4521120/2685496

我很少知道默认情况下session_start();会使用值覆盖您的Cache-control和Expires标头,以确保页面不会被缓存。

您可以在session_cache_limiter('public');之前使用session_start();,就像Marcin建议的那样,或者您可以在header();之后添加session_start();语句。