我正在尝试使用Cloudfront在s3上托管图像,但是我希望客户端在使用查询参数发出图像请求时选择图像的大小。
我想使用签名的url,因此,如果用户具有签名的url,则他们可以访问所需大小的图像。问题是,在签名期间必须将图像大小查询参数附加到url上,否则附加大小查询参数将导致签名检查不通过。这意味着如果我希望图像具有两种不同的大小,则需要两次往返于服务器以使用size参数对URL进行签名,然后从cloudfront获取图像。我想避免这种情况。
有什么办法可以做到这一点?
答案 0 :(得分:0)
已解决!感谢@Michael-sqlbot。通过使用自定义策略,我可以使用一个签名的URL返回任何想要的图像尺寸,包括原始尺寸。如果其他人遇到此问题,请按以下步骤操作:
我的用于生成签名URL的php代码:
public static function signedImageUrl($resource)
{
// Build Url
$url = self::CLOUDFRONT_BASE . ltrim($resource, '/') . '?w=*&h=*';
// Create a CloudFront Client
$client = new CloudFrontClient([
'version' => '2014-11-06',
'region' => 'us-east-2'
]);
// Set up parameter values for the resource
$expires = time() + 300;
// Policy
$policy = '{
"Statement": [
{
"Resource":"' . $url . '",
"Condition":{
"DateLessThan":{"AWS:EpochTime":' . $expires . '}
}
}
]
}';
// Create a signed URL for the resource using the canned policy
$signedUrlCannedPolicy = $client->getSignedUrl([
'url' => $url,
'policy' => $policy,
'private_key' => env('AWS_CLOUDFRONT_PRIVATE_KEY_PATH'),
'key_pair_id' => env('AWS_CLOUDFRONT_KEY_PAIR_ID')
]);
return $signedUrlCannedPolicy;
}
其中CLOUDFRONT_BASE是我的Cloudfront发行版的.cloudfront.net /域,而$ resource是文件名(例如my_profile_image.png)
这时,我得到了签名的图像,然后可以将客户端上的w和h查询参数修改为我喜欢的内容。我的lambda函数在cloudfront ViewerRequest事件上触发,它将指示cloudfront加载具有指定尺寸的图像,或者如果w和h均为*,则加载原始图像。
答案 1 :(得分:0)
您还可以在路径的末尾添加星号(例如HashSet<T>
),以允许添加其他可选参数。