HTTPリダイレクトコードの違い


151

さまざまなHTTP 3XXリダイレクトコードの違いは明確ではありません。はい、私は仕様を読みましたが、ここでは標準と実際の実践との間にいくつかの矛盾があるようです。

301リダイレクトコードは明らかに十分なようだ:リソースが恒久的に別のURIに移動されました。この手段を、そして未来の要求はURIことを使用する必要があります。

また、307リダイレクトコードも明確に見えます。つまり、リダイレクトは一時的なものであり、今後のリクエストでは引き続き元のURIを使用する必要があります。

しかし、私は違いが間にあるものを言うことができない302303、あるいはそれらのいずれかから、本当に異なっている理由301302もともとは一時的なリダイレクト(のような307)を意図していたようですが、実際には、ほとんどのブラウザはのように処理していました303。しかし、a 303とaの違いは何301ですか?される301リダイレクトがあることを意味することになって、より恒久的な?

回答:


139
  • 301:永続的なリダイレクト。このリソースに対する後続のリクエストを行うクライアントは、新しいURIを使用する必要があります。クライアントは、POST / PUT / DELETE要求のリダイレクトを自動的にたどってはなりません
  • 302:未定義の理由でリダイレクトします。このリソースに対する後続のリクエストを行うクライアントは、新しいURIを使用しないでください。クライアントは、POST / PUT / DELETE要求のリダイレクトを自動的にたどってはなりません
  • 303:未定義の理由でリダイレクトします。通常、「操作は完了しました。他の場所で続行してください。」このリソースに対する後続のリクエストを行うクライアントは、新しいURIを使用しないでください。クライアント POST / PUT / DELETEリクエストのリダイレクトに従いますが、フォローアップリクエストにはGETを使用します
  • 307:一時的なリダイレクト。リソースは後でこの場所に戻る可能性があります。このリソースに対する後続のリクエストを行うクライアントは、古いURIを使用する必要があります。クライアントは、POST / PUT / DELETE要求のリダイレクトを自動的にたどってはなりません

個人的には、選択肢があれば302を避けることをお勧めします。多くのクライアントは、302に遭遇したときに仕様に準拠していません。一時的なリダイレクトの場合は、非GETリクエストで必要な動作のタイプに応じて、303または307を使用する必要があります。POST / PUT / DELETEで別の動作が必要でない限り、307から303を優先してください。


26
いいえ。303をフォローするには、メソッドをGETに書き換える必要があります。他の人をフォローするには、メソッドを維持する必要がありますが、メソッドが安全でない場合はUAに確認する必要があります(したがって、OPTIONS、HEAD、GET、PROPFIND ...以外のメソッド)
Julian Reschke

1
@JulianReschke仕様の中で、ステートメントを裏付ける場所を指摘していただけませんか?
Piotr Dobrogost

7
@BobAman説明では、元のHTTP仕様(RFC 1945)で行われたのと同じ誤りを犯しています。たとえば、クライアントはPOST / PUT / DELETEリクエストのリダイレクトに従う必要があると言っています。303リダイレクト後、次のリクエストで使用するhttp動詞がGETでなければならないこと指定せずに誤解を招く...
Piotr Dobrogost

2
自分自身を修正する:「303を実行するには、最初のメソッドがHEADでない限り、メソッドをGETに書き換える必要があります。」
ジュリアンレシュケ

2
Piotr:デフォルトではメソッドを変更しないでください。リソースは移動しましたが、操作方法には影響しません。303は例外です。「リソースが移動した」という意味ではなく、「リクエストが処理されました。結果はこちらです」。まったく別のタイプのリダイレクトです。greenbytes.de/tech/webdav/…を
Julian Reschke

84

303と307の違いは次のとおりです。

303:他を参照してください。リクエストは正しく受信されますが、結果はリダイレクトURLでGETを使用して取得する必要があります。

307:一時的なリダイレクト。リクエスト全体を新しいURLにリダイレクトする必要があります。投稿データは再投稿する必要があります。

302は307の動作を意図したものでしたが、ほとんどのブラウザーはそれを303の動作として実装したことに注意してください(どちらも当時は存在しませんでした)。したがって、これらの2つの新しいコードは302を置き換えるために導入されました。

301と303の違い:

301:ドキュメントが移動されました。今後のリクエストでは、新しいURLを使用する必要があります。このURLは廃止されました。

注:このコードには注意してください。ブラウザとプロキシは、非常に積極的なキャッシュを適用する傾向があるため、301で返信すると、誰かがそのURLに再度アクセスするまでに時間がかかる場合があります。

303:リクエストは正しく受信されました。すべてのPUT要求が処理されます。結果のドキュメントには、リダイレクトURLから取得することができます。今後のリクエストでは、元のURLに移動する必要があります。


3xx(およびそれに関するすべての問題)の詳細を説明する優れたブログ投稿は次のとおり
2014/02

@ skeller88あなたの変更は私の答えを間違ったので私はそれを元に戻しました(変更を受け入れた人々にお願いします)!受け入れられた回答と同じミスを導入しました。303は異なる種類のリダイレクトであり、異なるルールが適用されます。承認された回答に対するJulian Reschkeのコメントと、arcuri82によってリンクされたブログ
GolezTrol
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.