Webアプリの一般的なシナリオは、データベースを変更するPOSTの後にリダイレクトすることです。ユーザーが作成した後に新しく作成されたデータベースオブジェクトにリダイレクトするのと同じです。
ほとんどのWebアプリは302リダイレクトを使用しているようですが、リダイレクトで指定されたURLをGETでフェッチする場合は、仕様に従って303を行うのが正しいようです。技術的には、302では、ブラウザは指定されたURLを、POSTである元のURLのフェッチと同じ方法でフェッチすることになっています。ただし、ほとんどのブラウザはそれを行いません。
302- http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.
303- http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.4
それでは、302または303を使用する必要がありますか?
依存します。
HTTP1.1で303および307応答が追加されました。
HTTP1.1 RFCに厳密に準拠しているクライアントエージェントは、303応答で問題ないはずです。
しかし、完全に準拠していない、またはHTTP1.0に準拠しており、303を処理できないエージェントが存在する可能性があります。
したがって、アプリケーションの応答がクライアントの実装の大部分によって適切に処理されることを確認するには、302が最も安全なオプションだと思います。
RFC-2616 からの抜粋:
注:多くのHTTP/1.1より前のユーザーエージェントは、303ステータスを理解していません。このようなクライアントとの相互運用性が懸念される場合は、ほとんどのユーザーエージェントがここで303について説明するように302応答に反応するため、代わりに302ステータスコードを使用できます。
正しいものは303です。
私はそれを使用しており、Netscape 4(1998年にリリースされた17年前)より新しいUAとの互換性の問題を発見していません。
302を使用している場合、UAがGETに切り替える代わりに、新しいURLにPOSTを再送信する危険性があります。
それでも、HTTP/1.0クライアント(vhostsをサポートしておらず、おそらくページにアクセスできない)が心配な場合は、303応答の本文に新しいページへのリンクを含むHTMLを含める必要があります( ApacheのようなWebサーバーはすでにそれを行っています。
ほとんどのサーバー側言語では、デフォルトのリダイレクトメカニズムは302を使用します。
response.sendRedirect(..)
は302を使用しますresponse.Redirect(..)
は302を使用しますheader("Location: ..")
は302を使用しますredirect_to
は302を使用したがって、ステータスとヘッダーを手動で設定するよりも、これを使用します。
理論的には、あなたが(そして世界中で)303を使用しているはずです。しかし、ほとんどのブラウザは303に反応するように302に反応します。したがって、全体として、302と303のどちらを送信しても問題ないようです。303仕様に指定したリンクには、興味深いメモがあります。 :
注:多くのHTTP/1.1より前のユーザーエージェントは、303ステータスを理解していません。このようなクライアントとの相互運用性が懸念される場合は、ほとんどのユーザーエージェントがここで303について説明するように302応答に反応するため、代わりに302ステータスコードを使用できます。
pre-HTTP/1.1ユーザーエージェントに注意することが重要なので、これは少し前に重要だったかもしれませんが、今はそうではないと思います。
つまり、全体として、それはあなた次第です(ユーザーがインターネットを破壊するのを恐れて、ブラウザーが302ステータスに対してその動作を決して変更しないことを望みます)。
POSTリクエストによって作成された新しいリソースの場所を提供する場合、201( "Created")は適切な応答です。
HTTP/1.1: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.2
Atom Publishing Protocol: http://tools.ietf.org/html/rfc5023#section-5.
これは、Webブラウザーがおそらく新しいURLにリダイレクトしないことを意味します。ユーザーはリンクをたどって新しいアイテムにアクセスする必要があります(このリンクは、応答の本文とLocationヘッダーで提供できます)。