我已经为服务器实现了媒体视图,否则保护图像。控制器处理请求并检查权限,并相应地为文件提供$this->response->file
。
但是,我还没有设法缓存图像,迫使浏览器总是重新下载(我从Firebug的Net面板知道这一点)。这些文件不太可能改变,因此缓存会大大加快速度。
我玩过$this->response->modified()
和cache()
,但无济于事。
如何在控制器操作中实施检查以服务器文件或未修改的状态代码?还是我离开这里?
任何帮助表示赞赏! :)
public function view($id)
{
$this->loadModel('Image');
$res = $this->Image->hasAccess($id, $this->Auth->user('subject_id'));
if($res['access'] || $this->isAdmin()){
$modified = gmdate("D, j M Y G:i:s ", filemtime ( APP . "Content/Images/" . $res['file']));
$this->response->modified($modified);
$this->response->expires(time() + 60 * 60 * 24 * 31);
$this->response->file( APP . "Content/Images/" . $res['file']);
}else if($res['access'] === false){
$this->response->statusCode(403);
}else if($res['access'] === null){
$this->response->statusCode(404);
}
return $this->response;
}
答案 0 :(得分:2)
我认为更好的解决方案是在你的vhost文件中添加标题,例如如果你使用nginx:
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires 1y;
log_not_found off;
}
这个解决方案更好,因为下次nginx不会使用php将文件发送给用户。
答案 1 :(得分:1)
使用CakeResponse::modified()
设置文件的修改时间,然后使用CakeResponse::checkNotModified()
检查用户代理是否具有文件的有效缓存版本。
$response->modified(filemtime($file));
if($response->checkNotModified($this->request))
{
return $response;
}
另见http://book.cakephp.org/2.0/en/controllers/request-response.html#the-last-modified-header