55

Web アプリの一般的なシナリオは、データベースを変更する POST の後にリダイレクトすることです。ユーザーが作成した後、新しく作成されたデータベース オブジェクトにリダイレクトするようなものです。

ほとんどの Web アプリは 302 リダイレクトを使用しているようですが、リダイレクトで指定された URL を GET で取得したい場合は、仕様に従って 303 が正しいことのようです。技術的には、302 の場合、ブラウザは元の URL を取得したのと同じ方法 (POST) で指定された URL を取得することになっています。ただし、ほとんどのブラウザはそれを行いません。

302 - http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.3

303 - http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.4

では、302 または 303 を使用する必要がありますか?

4

5 に答える 5

59

正解は303です。

私はこれを使用していますが、Netscape 4 (1998 年、 17 年前にリリース) よりも新しい UA との互換性の問題は見つかりませんでした。

302 を使用すると、UA が GET に切り替える代わりに、新しい URL に POST を再送信する危険があります。

それでも、HTTP/1.0 クライアント (仮想ホストをサポートしておらず、おそらくページにアクセスできない) が心配な場合は、新しいページへのリンクを含む HTML を 303 応答の本文に含める必要があります ( Apache のような Web サーバーはすでにそれを行っています)。

于 2011-07-22T10:03:43.387 に答える
22

依存します。
HTTP1.1 で 303 および 307 レスポンスが追加されました。
したがって、HTTP1.1 RFC に厳密に準拠しているクライアント エージェントは、303 応答で問題ないはずです。
しかし、完全に準拠していない、または HTTP1.0 に準拠していて 303 を処理できないエージェントが存在する可能性があり
ます。そのため、アプリケーションの応答が大多数のクライアント実装によって適切に処理されるようにするために、302 は最も安全なオプション。RFC-2616
からの抜粋:

注: 多くの HTTP/1.1 以前のユーザー エージェントは 303 ステータスを理解していません。このようなクライアントとの相互運用性が懸念される場合は、代わりに 302 ステータス コードを使用できます。これは、ほとんどのユーザー エージェントが 303 についてここで説明されているように 302 応答に反応するためです。

于 2011-02-26T19:13:26.790 に答える
9

ほとんどのサーバー側言語では、デフォルトのリダイレクト メカニズムで 302 が使用されます。

  • Javaresponse.sendRedirect(..)は 302 を使用します
  • ASP.NETresponse.Redirect(..)は 302 を使用します
  • PHPheader("Location: ..")は 302 を使用します
  • RoRredirect_toは 302 を使用します
  • 等..

したがって、ステータスとヘッダーを手動で設定するよりも、これをお勧めします。

于 2011-02-26T19:15:32.883 に答える
6

理論的には、ご指摘のとおり、あなた (および全世界) は 303 を使用する必要があります。しかしまた、ほとんどのブラウザーは 303 に反応するように 302 に反応します。したがって、全体として、302 を送信するか 303 を送信するかは問題ではないようです。303 仕様について提供したリンクには、興味深いメモがあります。 :

注: 多くの HTTP/1.1 以前のユーザー エージェントは 303 ステータスを理解していません。このようなクライアントとの相互運用性が懸念される場合は、代わりに 302 ステータス コードを使用できます。これは、ほとんどのユーザー エージェントが 303 についてここで説明されているように 302 応答に反応するためです。

HTTP/1.1 より前のユーザー エージェントに注意することが重要です。そのため、これは少し前には重要だったかもしれませんが、現在はそうではないと思います。

つまり、全体として、それはあなた次第です (ブラウザーが 302 ステータスに対する動作を決して変更しないことは、ユーザーのインターネットを壊すことを恐れて、あなたが望むものに賭けることができます)。

于 2011-02-26T19:14:25.067 に答える
4

POST リクエストによって作成された新しいリソースの場所を提供する場合、201 (「作成済み」) が適切な応答です。

HTTP/1.1: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.2

Atom パブリッシング プロトコル: https://www.rfc-editor.org/rfc/rfc5023#section-5.3

ただし、これは、Web ブラウザーがおそらく新しい URL にリダイレクトしないことを意味します。ユーザーはリンクをたどって新しいアイテムにアクセスする必要があります (このリンクは、レスポンスの本文と Location ヘッダーで提供できます)。

于 2012-05-08T09:59:23.733 に答える