私は現在、AWS S3を使用してシステムを作成しています。私は現在、署名されたURLの仮想ホストを設定する際に問題が発生しています。 bucket.s3を指し示すCNAMEレコードをAmazon S3は署名付きURLに仮想ホストを使用します
<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
されています。次のコードは、$source=http://media.example.com/object-key
と
$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();
}
}
このコードが実行さ$host=media.example.com
を実行する前に
、私はこのエラーが発生します.amazonaws.com
私がhttp://media.example.com/object-key
にアクセスすると、ファイルが正しく取得されます。署名されたURLにこの仮想ホストを設定するにはどうすればよいですか?
「パススタイル」はバケット名を最初の要素として指定するURLを参照するため、 ''use_path_style_endpoint' => true、または ' 'force_path_style '=> trueのいずれかが間違っているようです。パス、そしてそれはまさにあなたのエラーが示していることです、ここで起こっています。それは2番目かもしれないようです。 –
私は 'force_path_style'を無効にしましたが、何も変わりません。 'use_path_style_endpoint'を無効にすると、署名されたURLは単に' media.example.com'の代わりに 'bucket.media.example.com'になります –
'// 'endpoint' => $ host、 。あなたが意図した通りにこのライブラリを使用していないように感じます。つまり、あなたが達成しようとしているものが完全に有効であっても、このライブラリの機能の意図的な部分ではないかもしれないので、成功するためには一見非論理的なアプローチが必要になるかもしれません。 –