http - CloudFront 签名 URL 抛出 403 禁止错误

标签 http amazon-web-services amazon-cloudfront

<分区>

我正在尝试将 CloudFront 用作我的视频点播网站的 CDN。

我已经创建了一个 HTTP 分发(因为我需要流式传输到 iOS 设备,所以 RTMP 不适合),并将源设置为我存储视频文件的 S3 存储桶。我还创建了一个 CloudFront key 对。

使用 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。

私钥文件的路径是正确的,我的bucket中的指定对象(REDACTED.m3u8)有Everyone权限可以查看/下载(与该文件夹中的所有其他对象一样)。然后我将 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 的需要时出现问题。

最佳答案

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

关于http - CloudFront 签名 URL 抛出 403 禁止错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27363451/

相关文章:

amazon-web-services - 如何部署新的 cloudfront s3 版本而不会出现短暂的不可用?

http - 如何在 HAProxy 上启用 HTTP/2?

javascript - 如何在没有默认 Accept header 的情况下重定向?

java - 我如何输出来控制台我的请求的正文

python - 如何访问来自 AWS Kinesis Data Stream 事件的数据?

amazon-web-services - 使用 godaddy 域的 HTTPS 连接到 cloudfront/S3

php - AWS - Cloudfront - 如何使用 Origin 自定义 header

http - 如何解释 HTTP Accept header ?

amazon-web-services - 在 AWS Beanstalk Docker 上部署 Play 框架时出错

python - 无法访问我在 AWS EC2 实例上托管的 Django 页面