finecms2.7.4图片无法缓存问题

By | 2016/04/18

问题表现

使用系统api调用图片的时候,图片没法缓存,每次都是去获取新的图片。结果就是增加了带宽消耗、客户端体验变差,特别是在图片轮播的情况下,图片每次都要发起请求确实是不小的压力。

问题分析

使用浏览器开发攻击,对请求头进行观察

Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Expires:Thu, 19 Nov 1981 08:52:00 GMT

可以看到“人为”的设置了不允许缓存,因为程序采用了CI的架构,所以no-cache应该是session引起的。其次因为是由php进行的返回处理,需要自行判断并返回304代码,web服务没法替你做这事。

问题修复

由于是上传的图片想缓存,修改的是/dayrui/module/member/controllers/Api.php文件,在输出函数thumb_display的header后面,添加如下代码:

$last_modified_time = filemtime($filename);
$gmt_mtime = gmdate(‘r’, $last_modified_time);
header(‘ETag: “‘.md5($last_modified_time.$file).'”‘);
header(‘Last-Modified: ‘.$gmt_mtime);
header(‘Cache-Control: public’);

if(isset($_SERVER[‘HTTP_IF_MODIFIED_SINCE’]) || isset($_SERVER[‘HTTP_IF_NONE_MATCH’])) {
if ($_SERVER[‘HTTP_IF_MODIFIED_SINCE’] == $gmt_mtime || str_replace(‘”‘, ”, stripslashes($_SERVER[‘HTTP_IF_NONE_MATCH’])) == md5($last_modified_time.$file)) {
header(‘HTTP/1.1 304 Not Modified’);
exit();
}
}

以上代码根据etag和时间戳判断是否返回304,返回304的同时,设置Cache-Control: public也是必要的,否则还是无法正常处理。

PS:

1.只要启用了session,页面会默认不启用缓存;

2.在用php处理静态文件的时候,不要忘记304\206状态,建议采用xsendfile处理。

发表评论

电子邮件地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据