浏览器缓存专用S3资源



堆栈为:

  1. 角度
  2. Laravel
  3. S3
  4. nginx

我正在使用S3来存储我的用户的机密资源。Bucket访问设置为private,这意味着我可以通过创建临时(签名、动态(链接或使用Storage::disk('s3')->get('path/to/resource')方法访问文件,并返回一个实际文件作为响应。

我正在寻找一种在用户浏览器中缓存资源的方法。我曾尝试在AWS上直接将缓存头设置为资源响应,但由于我正在创建临时URL,它们是动态的,在这种情况下缓存不起作用。

任何建议都将不胜感激。

EDIT:使整个问题更加复杂的一件事是,资源的安全性应该完好无损。这意味着我需要一种缓存资源的方法,但同时我必须防止用户复制粘贴链接并在应用程序之外使用它们(通过直接链接与他人共享(。

就安全性而言,临时链接仍然不是一个理想的解决方案,因为它们可以在有效期内(在我的情况下是30秒(共享(并多次访问(。

只要URL保持不变,缓存将按原样工作(基于Cache-Control等(。所以,如果你的应用程序使用相同的签名URL一段时间,你会没事的。

当您想要更新过期日期或其他内容时,就会出现问题。这当然有不同的查询字符串参数,实际上是一个不同的URL。您需要一个不同的缓存密钥,但浏览器默认情况下对此没有概念。

如果您的安全性可以接受,您可以创建一个Service Worker,它只使用基本URL(没有querystring(作为缓存密钥。然后,无论其他URL参数如何,将来对bucket上相同对象的请求都可以使用缓存的响应。

我必须防止用户复制粘贴链接并在应用程序之外使用它们(通过直接链接与他人共享(。

这部分需求是不可能的,与缓存无关。一旦该URL被签名,它就可以被其他人使用。

您只需在代码中添加一个参数

'ResponseCacheControl' => 'no-store'
Storage::disk('s3')->getAwsTemporaryUrl(Storage::disk('s3')->getDriver()->getAdapter(), trim($mNameS3), CarbonCarbon::now()->addMinutes(config('app.aws_bucket_temp_url_time')), ['ResponseCacheControl' => 'no-store']);

最新更新