HTTPステータスコード302と307の違い
疑問
HTTPステータスコードの3xx系はリダイレクトを表すが、いまいちどういう違いなのか分からない
経緯
AWSの公式トップページ(https://aws.amazon.com/jp/) にアクセスしてみました。
開発者ツールのネットワークタブを確認すると、200 OK
が返ります。
次に、https://aws.amazon.com のように末尾の/jp
を取ったかたちでアクセスしてみます。
すると、今度は302 Found
が返り、先ほどの/jp
のサイトにリダイレクトされました。
おそらくですが、リクエスト元のIPアドレスやブラウザの言語設定などから判断して適切な地域・言語のサイトにリダイレクトしているのだと思われます(こちらご存じの方がいらっしゃったら教えていただきたいです)
最後に、http://aws.amazon.com のように、https
ではなくhttp
でアクセスしてみました。
すると今度はhttps
のサイトにリダイレクトされましたが、返ってきたステータスコードは302 Found
ではなく307 Internal Redirect
でした。
なぜこのような違いがあるのか気になったので調べました。
3xx系ステータスコード一覧
まずは、3xx系のステータスコード一覧を見てみましょう。
ステータスコード | 名前 | 説明 |
---|---|---|
300 | Multiple Choices | リクエストに対する複数の選択肢が存在する。クライアントが選択する必要がある。 |
301 | Moved Permanently | リクエストしたリソースが恒久的に別のURLに移動した。検索エンジンはリダイレクト先を記憶する。 |
302 | Found | リクエストしたリソースが一時的に別のURLに移動している。HTTP/1.0では一時的リダイレクトを示す。 |
303 | See Other | リクエストしたリソースが別のURLにあることを示し、GET メソッドでリダイレクトを行う。 |
304 | Not Modified | キャッシュされたリソースが更新されていないため、クライアントはキャッシュを利用すべきである。 |
305 | Use Proxy | リクエストしたリソースにアクセスするためにはプロキシを使用する必要がある。 |
306 | (Unused) | 現在は使用されていない。将来の利用のために予約されている。 |
307 | Temporary Redirect | リクエストしたリソースが一時的に別のURLに移動している。HTTPメソッドを保持する。 |
308 | Permanent Redirect | リクエストしたリソースが恒久的に別のURLに移動している。HTTPメソッドを保持したままリダイレクト。 |
Chromeでは307 Internal Redirect
となっていましたが、調べると正式な名前は307 Temporary Redirect
のようでした(理由は不明)
302と307の違い
上記表の説明のように、302、307はどちらも一時なリダイレクトを表します。
調べたところ、違いは「307の方はHTTPメソッドを保持する」ということのみのようです。
なぜこのような差分を持つ2つのステータスコードが生まれたのでしょうか。
もともと302 Found
は、HTTP/1.0の時代から存在するコードで、一時的なリダイレクトを示すために使用されていました。しかし、HTTP/1.0での仕様は曖昧だったため、一部のクライアントが302を受け取った際、POSTリクエストをGETリクエストに変換してしまうなど、不正確な動作が発生しました。
そこで、HTTP/1.1が登場した際に、上記の解決するために新しいステータスコード307 Temporary Redirect
が導入されたようです。
なぜ302と307が混在しているのか
しかし、結局AWSの公式トップページでなぜ2つのステータスコードが混在しているのかは不明でした。
リダイレクトが設定された時期が違うのではないかと思いましたが、AWSが2006年から存在するサービスなのに対して、HTTP/1.1は1997年には既にRFC2068として公開されています。
理由をご存じの方がいらっしゃったらぜひ教えていただきたいです。
Discussion