尝试使用PHP的HTTP缓存标头时出现奇怪的错误

时间:2009-06-08 18:17:30

标签: php caching

我正在设置我认为从PHP缓存的正确HTTP标头,并且每隔一个请求就会出现500错误。

有人能指出我正确的方向吗?

执行缓存的代码是:

<?php
header('Content-Type: text/css');
$content = file_get_contents('test.css');
header('Content-Length: '. strlen($content ));

$expires = 3600;
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
  // Split the If-Modified-Since (Netscape < v6 gets this wrong) 
  $modifiedSince = explode(';', $_SERVER['HTTP_IF_MODIFIED_SINCE']); 

  // Turn the client request If-Modified-Since into a timestamp 
  $modifiedSince = strtotime($modifiedSince[0]); 
  $current_time = time();
  if (($current_time - $modifiedSince) < $expires) {
    header("304 Not Modified");

    //echo $current_time - $modifiedSince;
    exit();
  }
}

$current_time = time();
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $current_time)." GMT");
header("Expires: " . gmdate("D, d M Y H:i:s", $current_time+$expires) . " GMT");
header("Cache-Control: max-age=$expires"); 
echo $content;

由于

编辑1:我已经清除了我的缓存,没有任何欢乐,有人报告它为他们工作。这是否意味着服务器配置问题?如果重要的话,它就在托管服务器上。

编辑2:似乎不会在IE中发生,但会在Firefox中发生

1 个答案:

答案 0 :(得分:4)

当我运行你的代码时,我没有收到状态500错误,但我看到其他所有请求“提供文件,提供空白页面”的行为与您描述的类似。

当您设置状态304时,您似乎没有正确使用header()函数。您错过了“HTTP / 1.1”。这意味着PHP正在发回状态200标头,然后退出而没有输出。尝试

header("HTTP/1.1 304 Not Modified");

如果您确实在每个其他请求上收到Server 500错误,请查看您的Web服务器(Apache?)日志以查看弹出的错误类型。