前書き
HTTPリクエストのリダイレクトの挙動とhttpのステータスコードの意味、振る舞いについて、個人的に気になったところなどを調べてまとめています。
要約
コード | 情報 | 意味 | UAによるメソッドの変更 | RFC |
---|---|---|---|---|
301 | Moved Permanently | 恒久的に移動した | 変更される場合がある | 1945, 2068, 2616 |
302 | Found | 発見した | 変更される場合がある | 1945, 2068, 2616 |
303 | See Other | 他を参照せよ | GETに変換されることを期待 | 2616,7231 |
307 | Temporary Redirect | 一時的リダイレクト | 変更してはならない | 2616,7231 |
308 | Permanent Redirect | 恒久的リダイレクト | 変更してはならない | 7238,7538 |
301 Moved Permanently
リクエストされたリソースが Location ヘッダーで示された URL に完全に移動したことを示す。ブラウザーはこのページにリダイレクトし、検索エンジンはリソースへのリンクを更新する。
リダイレクトが行われるとき、仕様書ではメソッド (と本文) を変更しないよう要求していたが、歴史的な理由により、ユーザーエージェントはリクエストを変更する場合がある。
すべてのユーザーエージェントが従っている訳ではないので、301のコードは GET または HEAD メソッドのみに使用し、POSTメソッドでは代わりに 308 Permanent Redirect (明確にメソッドの変更が禁止)を使用することが推奨
302 Found
リクエストされたリソースが一時的に Location で示された URL へ移動したことを示す。ブラウザーはこのページにリダイレクトしますが、検索エンジンはリソースへのリンクを更新しない。
リダイレクトが行われるとき、仕様書ではメソッド (と本文) を変更しないよう要求していたが、歴史的な理由により、ユーザーエージェントはリクエストを変更する場合がある。
すべてのユーザーエージェントが従っている訳ではないので、302のコードは GET または HEAD メソッドのみに使用し、POSTメソッドでは代わりに 307 Temporary Redirect (明確にメソッドの変更が禁止)を使用することが推奨。
303 See Other
オリジンサーバーがHTTP経由でサーバーによって転送できるターゲットリソースの表現を持っていないことを示す。
このステータスコードはロケーションヘッダーとともに使用する必要があり、サーバーがPOSTまたはその他のべき等でない要求に303 See Other応答とロケーションヘッダーの値で応答する場合、クライアントはGETメソッドを使用してロケーションヘッダーに記載されているリソースを取得することが期待される。
用途としては、PUT メソッドへのレスポンスで、アップロードされたリソースではないところで「XYZ のアップロードに成功しました」のような確認メッセージを表示したい場合や、アップロード進捗ページのような別なページであることを示す場合に便利。
307 Temporary Redirect
リクエストされたリソースが一時的に Location で示された URL へ移動したことを示す。元のリクエストのメソッドと本文は、リダイレクトされたリクエストを行う際に再利用されることを期待する。
307 と 302 の違いは、 307 はリダイレクトされたリクエストが行われるときに、メソッドと本文が変更されないことが保証されること。 これをもう少し噛み砕くと、302 では、一部の古いクライアントは不正にメソッドを GET に変更するものがあるが、307 では、変更してはならない。
ただし、Google chromeなどでは 307 が Internal Redirect としてHSTSのリダイレクト時に使われている。
308 Permanent Redirect
クエストされたリソースが Location ヘッダーで示された URL へ完全に移動したことを示す。ブラウザーはこのページにリダイレクトし、検索エンジンはリソースへのリンクを更新する。
308 と 301 の違いは、 308 はリダイレクトされたリクエストが行われるときに、メソッドと本文が変更されないことが保証されること。 これをもう少し噛み砕くと、301 では、一部の古いクライアントは不正にメソッドを GET に変更するものがあるが、308 では、変更してはならない。
ただし、ウェブアプリケーションによっては、 308 Permanent Redirect を標準外かつ他の目的に使用していることがある。例えば、 Google Drive はアップロードが不完全に停止したことを表すために、308 Resume Incomplete レスポンスを使用している。
参考
https://tools.ietf.org/html/rfc1945
https://tools.ietf.org/html/rfc2068
https://tools.ietf.org/html/rfc2616
https://tools.ietf.org/html/rfc7231
https://tools.ietf.org/html/rfc7238
https://tools.ietf.org/html/rfc7538
https://postd.cc/choosing-an-http-status-code/
https://www.techscore.com/blog/2016/01/23/http-redirection-status-code/
https://developer.mozilla.org/ja/docs/Web/HTTP/Status/301
https://developer.mozilla.org/ja/docs/Web/HTTP/Status/302
https://developer.mozilla.org/ja/docs/Web/HTTP/Status/303
https://developer.mozilla.org/ja/docs/Web/HTTP/Status/307
https://developer.mozilla.org/ja/docs/Web/HTTP/Status/308