在php中使用http标头缓存问题

时间:2012-01-16 21:52:17

标签: php http caching header browser-cache

我在显示图像的php服务上工作。我的问题是我无法正确处理浏览器缓存。

这是代码:

date_default_timezone_set('Europe/Brussel');
$expireTime = 7200;
header('Date: '.gmdate('D, d M Y H:i:s', time()).' GMT');
header('Expires: '.gmdate('D, d M Y H:i:s', time() + $expireTime).' GMT');
header('Cache-Control: max-age='. ($expireTime).', public'); // must-revalidate ?
header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($path)).' GMT');
header('Content-Type: '.HelpersFile::getMIME($path));
header('Content-Length: ' . filesize($path));
header('Content-Disposition: inline;');
header('Pragma: public');
$fileRessource = fopen($path, 'rb');
fpassthru($fileRessource);
header('Connection: Close');
exit();

结果是http://web-sniffer.net/

  

状态:HTTP / 1.1 200 OK   日期:星期一,2012年1月16日21:21:25 GMT
  服务器:Apache / 2.2.16(Debian)
  X-Powered-By:PHP / 5.3.3-7 + squeeze3
  Set-Cookie:PHPSESSID = 86m4rha4rvth4q8srrpg48t4t0;路径= /
  到期日:2012年1月16日星期一23:21:25 GMT
  缓存控制:max-age = 7200,public
  Pragma:public
  Last-Modified:太阳,2012年1月15日14:42:39 GMT
  内容长度:223247
  内容处理:内联;   连接:关闭
  内容类型:image / png

最后,你可以在这里看到PHP服务: http://spinephp.info/service/MediaLibrary/mediaWithId/1.jpg

如果我将文件加载到Chrome或任何其他浏览器,我总是从服务器获得200 OK回复,浏览器永远不会从其缓存中加载文件。

我不知道我做错了什么。 有没有人对我有任何线索?

[编辑] 更确切地说,我想要的是客户端浏览器在2小时内根本不查询服务器。这可能吗?

2 个答案:

答案 0 :(得分:0)

您需要评估客户端发送的If-Modified-Since标头。如果此后文件尚未修改,则应仅发送304响应。

您可以通过301重定向到实际文件并让Web服务器完成工作来保存自己的代码。

答案 1 :(得分:0)

这对我有用。只是不要点击F5,因为这会强制刷新。要测试它,只需单击您的地址栏并按Enter键。

解析If-Modified-如果您确实进行了真正的刷新,那么这是一个额外的好处。