使用“ aws / aws-sdk-php”:“ ^ 3.0@dev”
我正在创建一个图像共享网站,但不希望人们将我的URL复制到另一个网站上来窃取我的内容/带宽。
我最初将对象存储为
return $s3->putObject([
'Bucket' => $bucket,
'Key' => $key,
'Body' => $file,
'ACL' => 'public-read',
]);
但是我已经删除了“公共阅读”,因此下面的网址不再有效
https://mybucket-images.s3.us-west-1.amazonaws.com/' . $key);
我需要做些什么来创建仍然可以被客户端缓存以访问对象的临时URL?
我想做的一件事是每周或每月更改一次密钥,但这需要我用cronjob更新所有对象。必须有一种创建临时访问URL的方法吗?
答案 0 :(得分:1)
使用服务器为存储桶中的密钥生成预签名的URL。
//Creating a presigned request
$s3Client = new Aws\S3\S3Client([
'profile' => 'default',
'region' => 'us-east-2',
'version' => '2006-03-01',
]);
$cmd = $s3Client->getCommand('GetObject', [
'Bucket' => 'my-bucket',
'Key' => 'testKey'
]);
$request = $s3Client->createPresignedRequest($cmd, '+20 minutes');
$presignedUrl = (string) $request->getUri();
取自https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/s3-presigned-url.html
但是,每当页面有请求时,您都必须这样做。链接将在任何地方都有效。您只需最小化其有效期。
如果您的网站是基于API的,并且您通过API检索了网址,那么这可能与您有关:
如果您的网站具有登录功能,则可以在提供预签名的URL之前检查身份验证逻辑。
如果没有,则可以使用Http Referrer(可以被欺骗)。或api键(例如在API Gateway中)
答案 1 :(得分:0)
如果您的目的是仅通过发布在您网站上的URL来使内容可读-而不是让同一个Web客户端使用从另一个站点访问的相同url无效,那么我认为您可能会发现这很困难。我想到的大多数方法都是伪造的。
我会看一看,看看它是否对您足够好:
答案 2 :(得分:0)
您可以使用以下代码:
""