浏览器不缓存通过PHP发送的图像

时间:2014-05-12 23:37:55

标签: php image caching

我试图强制浏览器尽可能长时间地缓存图像但是它不起作用,浏览器总是请求新图像。我目前的代码是这样的:

session_cache_limiter('');

$gifData = "\x47\x49\x46\x38\x37\x61\x1\x0\x1\x0\x80\x0\x0\xfc\x6a\x6c\x0\x0\x0\x2c\x0\x0\x0\x0\x1\x0\x1\x0\x0\x2\x2\x44\x1\x0\x3b";
header('Content-Type: image/gif');
header("Expires: " . gmstrftime("%a, %d %b %Y %H:%M:%S GMT", time() + 365 * 86440));
header("Cache-Control: public, max-age=31556926, pre-check=10800");
header("Pragma: cache");
header('Content-Length: ' . strlen($gifData));
echo $gifData;

在浏览器中我得到了这个:

请求标题:

Request URL:http://example.com/track/8c0343920ff823148261ef1cc70e74b5_4_123.gif
Request Method:GET
Status Code:200 OK
Request Headersview source
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8,fr;q=0.6
Cache-Control:max-age=0
Connection:keep-alive
Host:example.com
Pragma:no-cache
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36

回复标题:

Cache-Control:public, max-age=31556926, pre-check=10800
Connection:Keep-Alive
Content-Length:35
Content-Type:image/gif
Date:Mon, 12 May 2014 23:31:49 GMT
Expires:Wed, 13 May 2015 03:35:09 GMT
Keep-Alive:timeout=5, max=100
Pragma:cache
Server:Apache/2.4.6 (Ubuntu)
X-Powered-By:PHP/   5.5.3-1ubuntu2.2

因此,只要我看到所有响应标头看起来都是正确的,但浏览器一直在询问图像。知道可能是什么问题吗?

2 个答案:

答案 0 :(得分:0)

您需要使用$_SERVER['HTTP_IF_MODIFIED_SINCE']之类的内容,如果时间戳没有更改,则会告诉浏览器使用图片$gifData的缓存版本。

if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) 
       && 
  (strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == filemtime($gifData))) {
  // send the last mod time of the file back
  header('Last-Modified: '.gmdate('D, d M Y H:i:s', filemtime($gifData)).' GMT', 
  true, 304);
  exit;
}

答案 1 :(得分:0)

正如@Jake指出的那样,问题是我正在对图像本身进行刷新,这意味着浏览器根本没有使用缓存。