Amazon S3将虚拟主机用于签名URL

时间:2017-10-03 04:31:54

标签: php amazon-web-services amazon-s3

我目前正在使用AWS S3创建系统,我的客户端需要为其系统签名的URL。但是我目前在设置签名URL的虚拟主机时遇到了麻烦。

在以下代码运行$source=http://media.example.com/object-key$host=media.example.com

之前
    $host = get_option('dn-s3-host');
        if (strpos($host,'http://') === FALSE) $host = 'http://' . $host;
        if (strpos($source,get_option('dn-s3-host')) !== FALSE) {
            $s3Client = new Aws\S3\S3Client(array(
                'version' => 'latest',
                'region'  => get_option('dn-s3-region'),
                'endpoint' => $host,
                'use_path_style_endpoint' => true,
                'force_path_style' => true,
                'credentials' => array(
                    // 'region'  => get_option('dn-s3-region'),
                    'key'=>get_option('dn-s3-key'),
                    'secret'=>get_option('dn-s3-secret')
                    )
            ));
            $source = str_replace('http://','',$source);
            $source = ltrim(str_replace(get_option('dn-s3-host'),'',$source),'/');
            $cmd = $s3Client->getCommand('GetObject',array(
                    'Bucket'=>get_option('dn-s3-bucket'),
                    'Key'=>$source
                ));
            $request = $s3Client->createPresignedRequest($cmd,'+2 hours');
            $source = (string) $request->getUri();
        }
    }

当此代码运行时,我收到此错误:

<Error>
    <Code>NoSuchKey</Code>
    <Message>The specified key does not exist.</Message>
    <Key>bucket/object-key</Key>
    <RequestId>363C44A299AA1E88</RequestId>
    <HostId>
     aCUab3+AD6396dJRMX8rCfYDl9EMjEBDn9somLQa3Ii6Bm6GoJGHT+f/qSZGprcR+3iG/hXC3EQ=
    </HostId>
</Error>

我的虚拟主机media.example.com是指向bucket.s3.amazonaws.com的CNAME记录

如果我访问http://media.example.com/object-key,我会正确获取该文件。如何为签名URL设置此虚拟主机?

1 个答案:

答案 0 :(得分:0)

如果您的签名网址无效,您将收到如下错误

<Error>
<Code>MissingKey</Code>
<Message>
Missing Key-Pair-Id query parameter or cookie value
</Message>
</Error>

错误表示该对象不存在。

根据错误消息

 <Key>bucket/object-key</Key>

看起来你的网址中有两次重复的存储桶。

尝试打印实际签名的网址并检查网址是什么样的,这样可以了解您在那里犯了什么错误。

希望它有所帮助。