1

我已经为服务器实现了媒体视图,否则受保护的图像。控制器处理请求并检查权限并相应地为文件提供服务$this->response->file

但是,我还没有设法缓存图像,迫使浏览器总是重新下载(我从 Firebug 的网络面板知道这一点)。这些文件不太可能改变,因此缓存会大大加快速度。

我玩过使用$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;
}
4

2 回答 2

2

我认为更好的解决方案是在您的 vhost 文件中添加标头,例如如果您使用 nginx:

location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
  expires 1y;
  log_not_found off;
}

这个解决方案更好,因为下次 nginx 不使用 php 向用户发送文件。

于 2013-10-07T21:03:39.393 回答
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

于 2013-10-07T21:06:07.447 回答