0

私のコンテンツで機能する URL は次のとおりです。

https://<bucket>.s3.amazonaws.com/<object> http://<bucket>.s3.amazonaws.com/<object>
<bucket>.s3.amazonaws.com/<object>
s3.amazonaws.com/<bucket>/<object>

この URL を機能させたい

<bucket>/<object>

しかし、それは機能していません。

このコードは機能します

$request = $client->get("http://{$bucket}.s3.amazonaws.com/{$s3name}");
return $client->createPresignedUrl($request, $time);

このコードはそうではありません

$request = $client->get("http://{$bucket}/{$s3name}");
return $client->createPresignedUrl($request, $time);

ここで誰か助けてくれませんか?これを機能させるには https が必要ですか? CNAMEも追加しました。

4

2 に答える 2

0

ホスト名に「s3.amazon...」コンポーネントを使用してアクセスするバケットのリクエストに署名する場合、署名する文字列には次のようなリソースが含まれます。

/bucket/object

当然の結論として、仮想ホスト バケットを使用している場合、リソースは次のようになります。

/object

しかし、それは正しくありません。URL のパス部分にバケット名が含まれていなくても、署名する文字列のオブジェクト名の前にバケット名が必要です (s3 が Host: ヘッダーから取得するため)。

http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html

これを確認するには、「このコードは機能します」の下に示したコードによって生成された署名付き URL を手動で取得し、ホスト名をバケット名に変更し、パスからバケットを削除すると、署名がまだ有効であることを確認できます。 URLを手動で目的の形式に書き換えましたが。

于 2013-08-26T12:24:49.673 に答える
0

これを実現するには、仮想ホスティングを使用する必要があります: http://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html

これには 2 つの部分が含まれます。まず、目的のホスト名で CNAME を設定します。次に、リクエストを行うときに正しいホスト名を送信していることを確認してください。ドキュメントから:

GET /homepage.html HTTP/1.1
Host: johnsmith.net.s3.amazonaws.com
于 2013-08-25T12:08:07.710 に答える