CloudFront签署的URL会丢失403 Forbidden错误

时间:2014-12-08 17:26:37

标签: http amazon-web-services amazon-cloudfront

我正在尝试将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)时,视频会显示,因此当我启用对签名网址的需求时会出现问题。

1 个答案:

答案 0 :(得分:0)

请检查您的过期是否已正确转换为UNIX时间戳。根据这个http://docs.aws.amazon.com/aws-sdk-php/latest/class-Aws.CloudFront.CloudFrontClient.html#_getSignedUrl你需要在那里传递时间戳