Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 配置AWS cloudfront以提供来自s3 bucket的签名url_Php_Amazon Web Services_Amazon S3_Laravel 5 - Fatal编程技术网

Php 配置AWS cloudfront以提供来自s3 bucket的签名url

Php 配置AWS cloudfront以提供来自s3 bucket的签名url,php,amazon-web-services,amazon-s3,laravel-5,Php,Amazon Web Services,Amazon S3,Laravel 5,我的s3存储桶中有一个名为private的文件夹,该文件夹中的内容仅由授权用户访问(即禁用公共读取访问) 因此,我正在生成一个标记url,用于访问该文件夹中的一个对象,它工作正常 这是签名的URL格式 s3-<region>.amazonaws.com/<folder>/<imagename>??X-Amz-Content-Sha256=....... s3-.amazonaws.com/。。。。。。。 我还为上述s3 bucket创建了cloudfron

我的s3存储桶中有一个名为
private
的文件夹,该文件夹中的内容仅由授权用户访问(即禁用公共读取访问)

因此,我正在生成一个标记url,用于访问该文件夹中的一个对象,它工作正常

这是签名的URL格式

s3-<region>.amazonaws.com/<folder>/<imagename>??X-Amz-Content-Sha256=.......
s3-.amazonaws.com/。。。。。。。
我还为上述s3 bucket创建了cloudfront发行版,以获得更好的性能。 这里是CloudFrontURL
xxxxjjj.cloudfront.net

那么,我如何使用这个cloudfront发行版提供我的签名url

当我尝试使用此url时

xxxxjjj.cloudfront.net/

我将遇到访问被拒绝错误,我认为这不是使用cloudfront发行版交付s3签名url内容的正确方法


使用php laravel framework

CloudFront的签名URL与S3的签名URL使用不同的格式和凭据

阅读

GitHub上有一个应用程序,您也可以从中编写自己的代码


为了测试CloudFront和S3设置,您可以在aws cli中使用生成测试签名URL。

CloudFront的签名URL使用与S3的签名URL不同的格式和凭据

阅读

GitHub上有一个应用程序,您也可以从中编写自己的代码


为了测试CloudFront和S3设置,您可以在aws cli中使用生成一个测试签名URL。

此链接中有一个使用PHP SDK的示例

以下是使用自定义策略的Larave(5.3)中的等效代码:

public static function signedUrl($resourceKey) {
    //$resourceKey = 'videos/example.mp4'
    $baseUrl = 'https://xxxxjjjj.cloudfront.net';
    $fullUrl = $baseUrl . '/' . $resourceKey;
    $expires = time() + 300;
    $customSigningPolicy = <<<POLICY
{
    "Statement": [
        {
            "Resource": "{$fullUrl}",
            "Condition": {
                "DateLessThan": {"AWS:EpochTime": {$expires}}
            }
        }
    ]
}
POLICY;

    // CloudFront Signed Urls
    /** @var CloudFrontClient $cloudFront */
    $cloudFront = \AWS::createClient('CloudFront');
    $url = $cloudFront->getSignedUrl([
        'url' => $fullUrl,
        'policy' =>  $customSigningPolicy,
        'key_pair_id' => 'YOUR_KEY_PAIR_ID',
        'private_key' => '/path/to/your/cloudfront-private-key.pem'
    ]);

    return $url;
}
公共静态函数signedUrl($resourceKey){
//$resourceKey='videos/example.mp4'
$baseUrl='0https://xxxxjjjj.cloudfront.net';
$fullUrl=$baseUrl.'/'.$resourceKey;
$expires=time()+300;
$customSigningPolicy=$customSigningPolicy,
“密钥对\u id”=>“您的密钥对\u id”,
'private_key'=>'/path/to/your/cloudfront private key.pem'
]);
返回$url;
}
另外,我在aws示例中发现了一个错误,因为他们在策略中使用$resourceKey作为资源值,这是不正常的,所以我使用的是文件的完整url

他们的代码:

$resourceKey = 'videos/example.mp4';
$customPolicy = <<<POLICY
{
    "Statement": [
        {
            "Resource": "{$resourceKey}",
            "Condition": {
                "IpAddress": {"AWS:SourceIp": "{$_SERVER['REMOTE_ADDR']}/32"},
                "DateLessThan": {"AWS:EpochTime": {$expires}}
            }
        }
    ]
}
POLICY;
$resourceKey='videos/example.mp4';

$customPolicy=在这个链接中有一个使用PHP SDK的示例

以下是使用自定义策略的Larave(5.3)中的等效代码:

public static function signedUrl($resourceKey) {
    //$resourceKey = 'videos/example.mp4'
    $baseUrl = 'https://xxxxjjjj.cloudfront.net';
    $fullUrl = $baseUrl . '/' . $resourceKey;
    $expires = time() + 300;
    $customSigningPolicy = <<<POLICY
{
    "Statement": [
        {
            "Resource": "{$fullUrl}",
            "Condition": {
                "DateLessThan": {"AWS:EpochTime": {$expires}}
            }
        }
    ]
}
POLICY;

    // CloudFront Signed Urls
    /** @var CloudFrontClient $cloudFront */
    $cloudFront = \AWS::createClient('CloudFront');
    $url = $cloudFront->getSignedUrl([
        'url' => $fullUrl,
        'policy' =>  $customSigningPolicy,
        'key_pair_id' => 'YOUR_KEY_PAIR_ID',
        'private_key' => '/path/to/your/cloudfront-private-key.pem'
    ]);

    return $url;
}
公共静态函数signedUrl($resourceKey){
//$resourceKey='videos/example.mp4'
$baseUrl='0https://xxxxjjjj.cloudfront.net';
$fullUrl=$baseUrl.'/'.$resourceKey;
$expires=time()+300;
$customSigningPolicy=$customSigningPolicy,
“密钥对\u id”=>“您的密钥对\u id”,
'private_key'=>'/path/to/your/cloudfront private key.pem'
]);
返回$url;
}
另外,我在aws示例中发现了一个错误,因为他们在策略中使用$resourceKey作为资源值,这是不正常的,所以我使用的是文件的完整url

他们的代码:

$resourceKey = 'videos/example.mp4';
$customPolicy = <<<POLICY
{
    "Statement": [
        {
            "Resource": "{$resourceKey}",
            "Condition": {
                "IpAddress": {"AWS:SourceIp": "{$_SERVER['REMOTE_ADDR']}/32"},
                "DateLessThan": {"AWS:EpochTime": {$expires}}
            }
        }
    ]
}
POLICY;
$resourceKey='videos/example.mp4';

$customPolicy=我已经使用php sdk生成了签名url,但是当我将基本部分ie(
s3-.amazonaws.com
替换为
hhsdjf.cloudfront.net
)更改url的主机组件时,它给出了一个拒绝访问的错误。更改url的主机组件并不是这样做的。CloudFront签名url完全不同,由不同的代码生成,并在查询字符串中包含
&密钥对Id=…
——它们不使用
X-Amz-Credential
,也不使用
AWSAccessKeyId
。我已经使用php sdk生成签名url,但当我使用基本部分ie时(
s3-.amazonaws.com
替换为
hhsdjf.cloudfront.net
)它的“拒绝访问”错误更改URL的主机组件与此不同。CloudFront签名的URL完全不同,由不同的代码生成,并在查询字符串中包含
&Key Pair Id=…
——它们不使用
X-Amz-Credential
,也不使用
AWSAccessKeyId