在网站上,我使用PHP的ImageMagick扩展动态生成图像。我使用.htaccess文件将以.jpg结尾的文件重写为php文件以进行动态生成:
RewriteRule ^([^_]+).jpg index.php?filename=$1
然后我在PHP文件中创建JPG图像:
$img->setImageFormat('jpeg');
在回显图像之前,我发出以下标题:
header("Content-Type: image/jpeg");
header('Expires: Mon, 26 Jul 2027 05:00:00 GMT');
header("Pragma: cache");
header("Cache-Control: max-age=290304001");
但是,使用Chrome" 是否已缓存?"扩展,我可以看到动态生成的图像不被缓存。此外,谷歌Chrome控制台正在说" 资源被解释为文档但是使用MIME类型转移图像/ jpeg "尽管已将标题设置为Content-Type: image/jpeg
。
所以我尝试使用.htaccess进行缓存,使用以下内容:
<filesMatch "\.(jpg)$">
Header set Cache-Control "max-age=290304001, public"
</filesMatch>
但那也是不工作。
所以我尝试将php
扩展名添加到.htaccess条件:
<filesMatch "\.(jpg|php)$">
Header set Cache-Control "max-age=290304001, public"
</filesMatch>
终于工作,图片被缓存了。所以我放心了,我得到了它的工作,但这种反复试验让我感到不安,我不明白为什么PHP缓存标题不起作用。
问题:
1)通过.htaccess文件进行缓存是否正确缓存用PHP动态生成的图像?
2)为什么PHP发送的缓存标头无效?
3)为什么Chrome的控制台会将&#34; 资源解释为文档,但使用MIME类型转换为image / jpeg &#34;标题何时设置为image/jpeg
?
4)有没有更好的方法来使用PHP缓存动态生成的图像(可能使用纯PHP而不使用.htaccess)?
答案 0 :(得分:-1)
尝试添加Last-Modified标头:
header("Last-Modified: Fri, 13 May 2016 13:16:19 GMT");
RFC2616中日期的格式。要以这种格式生成日期,您可以使用\ DateTime :: RSS常量,例如
echo (new \DateTime())->format(\DateTime::RSS);
或
echo date(\DateTime::RSS);
当然,日期不应随每个请求而改变。
希望这有帮助!