我正在尝试将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',
));
这会创建一个看我期望的网址。
私钥文件的路径正确,我的存储桶中的指定对象( REDACTED.m3u8 )拥有所有人的权限查看/下载(与该文件夹中的所有其他对象一样)。然后我将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检索任何对象?
我已禁用对已签名网址的要求,当我访问没有查询字符串参数的对象(即http://REDACTED.cloudfront.net/videos/output/hls/REDACTED.m3u8)时,视频会显示,因此当我启用对签名网址的需求时会出现问题。
答案 0 :(得分:0)
请检查您的过期是否已正确转换为UNIX时间戳。根据这个http://docs.aws.amazon.com/aws-sdk-php/latest/class-Aws.CloudFront.CloudFrontClient.html#_getSignedUrl你需要在那里传递时间戳