努力寻找答案,在stackoverflow上查看了其他类似问题,但这些解决方案无效。
我设置了显示图像的路线。基本上,它尝试从我的digitalocean空间(S3存储桶)中获取URL,然后显示它。问题是,即使设置了正确的缓存头,浏览器也不知道使用缓存副本。
这是“流式处理”文件的代码部分:
$disk = 'do_spaces';
$url = Storage::disk($disk)->url($directory.'/'.$fileName);
$secondsToCache = 86400;
$ts = gmdate("D, d M Y H:i:s", time() + $secondsToCache) . " GMT";
$lm = gmdate("D, d M Y H:i:s", time()) . " GMT";
return response()->stream(function () use ($url) {
return readfile($url);
},200, [
//'status' => 304,
'Content-Type' => $mimeType,
'Pragma' => 'cache', //cache or no-cache
'Expires' => $ts, //set expiration date
'Last-Modified' => $lm,
'Cache-Control' => 'max-age='.$secondsToCache //"no-cache, must-revalidate, no-store, max-age=0, private",
]);
每当我直接访问图像时,刷新时它将使用缓存的副本。当我访问我的路线(通过php生成的图像)时,不会缓存。
我曾经尝试检查$_SERVER['HTTP_IF_MODIFIED_SINCE']
,但是当我打印可用的$ _SERVER变量时,它永远都没有,所以我不能简单地发送304响应来告诉浏览器使用缓存的副本。
为什么我不直接链接到图像?主要是因为我想将图像URL定向到我的网站,而不是digitalocean url(当然,如果使用php进行交付,图片会产生过多的开销,然后我可以切换为直接网址,但对我来说这是不得已的选择。)
感谢任何想法或建议,谢谢!