我在Laravel 4中编写了一个控制器来提供静态资源,例如带有一些应用程序级跟踪的图像文件。我不希望人们不得不经常为每个图像点击Web服务器,所以我试图设置一个Cache-Control头。我在这里结束了我的智慧,它显然不起作用,我无法弄清楚原因。有人可以看看以下内容并告诉我我做错了什么吗?
$headers = array(
'Content-Type' => 'image/png',
'Cache-Control' => 'public, max-age=300',
'Content-Length' => filesize($file),
'Expires' => date('D, d M Y H:i:s ', time() + 300).'GMT',
);
return Response::stream(function() use ($file) {
readfile($file); }, 200, $headers);
当我访问该文件时,它几乎完美无缺。显示图像,当我进入并使用Chrome或Firefox检查元素时,我可以看到Expires标头设置正确(当我更改它并强制重新加载时,它会适当地重置它)。但无论我尝试什么,Cache-Control标头总是设置为“no-cache,private”。我尝试过使用以下内容,但都无济于事:
$headers['Cache-Control'] = 'public, max-age=300'; // Original setting
$headers['cache-control'] = 'public, max-age=300'; // Case-sensitive?
$headers['Cache-Control'] = 'max-age=300';
$headers['Cache-Control'] = 'private, max-age=300';
$headers['Cache-Control'] = 'max-age=300, public';
$headers['Cache-Control'] = 'max-age=300, private';
但就像我说的那样,无论我将其设置为什么,始终都会返回一个响应标头,显示Cache-Control:no-cache,private。
我做错了什么?如何通过此控制器返回我的图像和二进制文件进行缓存?由于某些原因,Laravel 4是否在所有响应中对Cache-Control标头进行了硬编码?
答案 0 :(得分:3)
请参阅此问题:https://github.com/symfony/symfony/issues/6530,此行:https://github.com/symfony/symfony/blob/2.4/src/Symfony/Component/HttpFoundation/StreamedResponse.php#L87
它建议使用BinaryFileResponse。像这样:
$response = new Symfony\Component\HttpFoundation\BinaryFileResponse($file);
$response->setContentDisposition('inline');
$response->setTtl(300);
return $response;
//Or with setting the headers manually
return new Symfony\Component\HttpFoundation\BinaryFileResponse($file, 200, $headers, true, 'inline');
现在您可以设置Cache-Control标头。
或使用Response :: download()外观:
return Response::download($file)->setTtl(300)->setContentDisposition('inline');
return Response::download($file, null, $headers)->setContentDisposition('inline');