リクエストのリダイレクトと REST API
このセクションでは、Amazon S3 REST API を使用して HTTP リダイレクトを処理する方法について説明します。Amazon S3 リダイレクトの一般的な情報については、Amazon Simple Storage Service API リファレンスの「リクエストの実行」を参照してください。
リダイレクトおよび HTTP ユーザーエージェント
Amazon S3 REST API を使用するプログラムは、アプリケーションレイヤーレベルまたは HTTP レイヤーレベルのいずれかでリダイレクトを処理する必要があります。HTTP クライアントライブラリとユーザーエージェントの多くは、リダイレクトを自動的に正しく処理するよう設定することができます。ただし、リダイレクト実装が不正確あるいは不完全であるものも多くあります。
ライブラリでリダイレクト要件を満たすようにする前に、次のテストを行ってください。
-
すべての HTTP リクエストヘッダーが (Authorization、Date などの HTTP 標準を含む)、リダイレクトされたリクエスト (リダイレクトの受信後の 2 番目のリクエスト) に適切に含まれていることを確認します。
-
PUT、DELETE など、非 GET リダイレクトが正しく動作することを確認します。
-
大きな PUT リクエストがリダイレクトに正しく従っていることを確認します。
-
100-continue レスポンスが届くまでに時間がかかる場合は、PUT リクエストがリダイレクトに正しく従っていることを確認します。
HTTP リクエストが GET または HEAD でない場合、RFC 2616 に厳密に準拠する HTTP ユーザーエージェントは、リダイレクトにしたがう前に明示的な確認が必要になることがあります。一般的に、Amazon S3 によって自動生成されたリダイレクトに従うと安全です。システムが amazonaws.com ドメイン内のホストのみに対してリダイレクトを発行し、リダイレクトされたリクエストの効果が元のリクエストと同じになるためです。
リダイレクトおよび 100-continue
リダイレクトの処理を簡素化し、効率性を高め、リダイレクトされたリクエストボディを 2 回送信するためのコストを排除するには、PUT オペレーションに対して 100-continue を使用するようにアプリケーションを設定します。100-continue を使用しているアプリケーションは、確認を受け取るまでリクエストボディを送信しません。ヘッダーに基づいてメッセージが拒否された場合、メッセージの本文は送信されません。100-continue の詳細については、「RFC 2616 Section 8.2.3
注記
RFC 2616 にしたがって、不明な HTTP サーバーで Expect: Continue
を使用する場合は、リクエストボディを送信する前の待機時間は無期限にしないでください。HTTP サーバーの中には、100-continue を認識しないものがあるからです。しかし、Amazon S3 は、リクエストに Expect: Continue
が含まれているかどうか、また一時的な 100-continue ステータスを返すか、最終ステータスコードを返すかを認識します。さらに、一時的な 100 continue の承認を受け取った後、リダイレクトエラーが発生することはありません。これは、リクエスト本文を書き込んでいる間は、リダイレクトレスポンスを受け取らないようにする際に役立ちます。
リダイレクトの例
このセクションでは、HTTP リダイレクトと 100-continue を使用したクライアントとサーバーのやり取りの例を紹介します。
quotes.s3.amazonaws.com
バケットに対する PUT の例を次に示します。
PUT /nelson.txt HTTP/1.1 Host: quotes.s3.amazonaws.com Date: Mon, 15 Oct 2007 22:18:46 +0000 Content-Length: 6 Expect: 100-continue
Amazon S3 は以下を返します。
HTTP/1.1 307 Temporary Redirect Location: http://quotes.s3-4c25d83b.amazonaws.com/nelson.txt?rk=8d47490b Content-Type: application/xml Transfer-Encoding: chunked Date: Mon, 15 Oct 2007 22:18:46 GMT Server: AmazonS3 <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>TemporaryRedirect</Code> <Message>Please re-send this request to the specified temporary endpoint. Continue to use the original request endpoint for future requests. </Message> <Endpoint>quotes.s3-4c25d83b.amazonaws.com</Endpoint> <Bucket>quotes</Bucket> </Error>
クライアントは、リダイレクトレスポンスにしたがって、新しいリクエストを quotes.s3-4c25d83b.amazonaws.com
一時エンドポイントに発行します。
PUT /nelson.txt?rk=8d47490b HTTP/1.1 Host: quotes.s3-4c25d83b.amazonaws.com Date: Mon, 15 Oct 2007 22:18:46 +0000 Content-Length: 6 Expect: 100-continue
Amazon S3 は 100-continue 返します。これは、クライアントがリクエストボディを送信し続ける必要があることを示します。
HTTP/1.1 100 Continue
クライアントはリクエストボディを送信します。
ha ha\n
Amazon S3 は最終レスポンスを返します。
HTTP/1.1 200 OK Date: Mon, 15 Oct 2007 22:18:48 GMT ETag: "a2c8d6b872054293afd41061e93bc289" Content-Length: 0 Server: AmazonS3