2017-07-20 45 views
0

我想将用户个人资料图片存储在S3存储桶中,但保留这些图像的私密性。为了做到这一点,我会在需要图像时创建预先注册的url。但是,这会每次都会创建一个唯一的url,这意味着该图像将永远不会被浏览器缓存,并且最终我会在GET请求中付出更多。AWS S3预定请求缓存

这里,我使用Laravel我的代码来生成URL的例子:

$s3 = \Storage::disk('s3'); 
$client = $s3->getDriver()->getAdapter()->getClient(); 
$expiry = new \DateTime('2017-07-25'); 

$command = $client->getCommand('GetObject', [ 
    'Bucket' => \Config::get('filesystems.disks.s3.bucket'), 
    'Key' => $key 
]); 

$request = $client->createPresignedRequest($command, $expiry); 

return (string) $request->getUri(); 

我认为,通过指定日期时间,而一个单位的时候,它实际上创建相同的URL,但它增加了剩余的URL的秒数,这里有一个例子:

xxxx.s3.eu-west-2.amazonaws.com/profile-pics/92323.png?X-Amz-Content-Sha256= UNSIGNED-PAYLOAD & X-Amz-Algorithm = AWS4-HMAC-SHA256 & X-Amz-Credential = AXXXXXXXXXXX%2Feu-west-2% 2Fs3%2Faws4_request & X-AMZ-日期= 20170720T112123Z & X-AMZ-SignedHeaders =宿主& X-AMZ-过期= 391117 & X-AMZ-签名= XXXXXXXXX

是否有可能产生一个可重复的presigned请求网址,以便用户浏览器可以缓存图像?

回答

1

而不是使用预先设定的URL机制,也许您可​​以添加一个经过身份验证的端点到您的应用程序,并在所述端点检索图像?在您的img标签等中使用此URL。此端点可以缓存图像并为浏览器提供适当的响应标头以缓存图像。

+2

谢谢,这是我的第一个想法,但后来我失去了完全绕过我的服务器资产的好处。 – ezero