楽しいだけで十分です

好きなことを書きます

HTTPステータスコード 302, 303, 307を整理する

会社で同期と話してる時に、「HTTPステータスコードの302, 303, 307って使い分けがよくわからないよねー」ってなったのですが、たまたまパーフェクトPHPで出てきたので、まとめておきます。

それぞれの定義

  • 302: Found
  • 303: See Other
  • 307: Temporary Redirect

どの定義もユースケースとしては、「一時的に別のURLを見て欲しい場合」に使用する

詳細な違い

  • 302, 307は定義上は同じもので、リダイレクト時に使用したものと同じHTTPメソッドでリダイレクトする
  • 303は、POSTリクエストでデータを送信した後に、表示用画面へGETでリダイレクトして欲しい場合に利用する

ここまでは、仕様の話なのですが、それを無視した挙動が存在するので、話がややこしいのです・・・

ややこしいところ

ほとんどのブラウザは302でも、303と同じようにGETでリダイレクトする (ほとんどのブラウザは、本来の302の仕様を無視している)

実際に、多くのフレームワーク (Ruby on Railsなど)でも、リダイレクトのデフォルトが302になってますよね

なんでこんなことになったの?

歴史的経緯によるものらしいです。

ざっとした、経緯の箇条書き

  • HTTP/1.0には、302 Temporary Redirectしか定義されていなかった
    • 303 See Other, 307 Temporary Redirectは、HTTP/1.1で策定された
  • HTTP/1.1では、「302はリダイレクト時にリクエストされたメソッドを変更してはならず、303はGETでリダイレクトを行う」という仕様にするつもりだったが、多くのブラウザが302を正しく実装せず、303的な挙動をするようにしていた
  • そこで、HTTP/1.1が改定された際に、本来の302の役割を、307 Temporary Redirectとして定義し、302は302 Foundと改定された

まとめ

とりあえず、一時的なリダイレクトを行うときは、302を使っておけば大丈夫みたいです。

なんで同じような定義がいっぱいあるんだろうなあと思ってたのですが、歴史を辿るとなるほどーという感じですね。

参考

gihyo.jp