这个问题在这里已有答案:
我正在尝试将CloudFront用作我的视频点播网站的CDN .
我已经创建了一个HTTP发行版(因为我需要流式传输到iOS设备,因此RTMP不合适),并将原点设置为我的S3存储区,其中存储了我的视频文件 . 我还创建了一个CloudFront密钥对 .
使用AWS PHP SDK,我创建一个这样的签名URL(在Laravel中):
$cloudfront = AWS::get('CloudFront');
$streamHostUrl = 'http://REDACTED.cloudfront.net';
$resourceKey = 'videos/output/hls/REDACTED.m3u8';
$expires = '+10 minutes';
$signed_url = $cloudfront->getSignedUrl(array(
'url' => sprintf('%s/%s', $streamHostUrl, $resourceKey),
'expires' => $expires,
'private_key' => base_path('cloudfront.pem'),
'key_pair_id' => 'APKAIPX4UJ26KJ65PKIA',
));
这会创建一个URL,看看我的期望 .
私钥文件的路径是正确的,并且我的存储桶中的指定对象( REDACTED.m3u8 )具有 Everyone 能够 View/Download 的权限(该文件夹中的所有其他对象也是如此) . 然后我将URL嵌入到网页中:
<!DOCTYPE html>
<html>
<head>
<title>HTTP Live Streaming Example</title>
</head>
<body>
<video src="<?php echo $signed_url; ?>" height="300" width="400" controls>
</video>
</body>
</html>
但是,这会向控制台抛出 403 Forbidden 错误 .
我究竟做错了什么?为什么无法通过CloudFront检索任何对象?
我已禁用对签名URL的要求,当我访问没有查询字符串参数的对象(即http://REDACTED.cloudfront.net/videos/output/hls/REDACTED.m3u8)时,视频会显示,因此当我启用对签名URL的需求时会出现问题 .
1 回答
请检查您的过期是否正确转换为UNIX时间戳 . 根据这个http://docs.aws.amazon.com/aws-sdk-php/latest/class-Aws.CloudFront.CloudFrontClient.html#_getSignedUrl你需要在那里传递时间戳