HTTPでリダイレクトさせるための応答ステータスコードにはたくさん種類がある。適切な使い分けができるように整理する。
結論から言うとリダイレクト関係のステータスコードは以下のように2つの軸のマトリクスとして整理できる。
元のメソッドを維持する | GETメソッドに変更する | メソッドの変更をするかどうか曖昧 | |
---|---|---|---|
恒久的 | 308 Permanent Redirect | 301 Moved Permanently | |
一時的 | 307 Temporary Redirect | 303 See Other | 302 Found |
以下では縦と横それぞれの軸について解説する。
恒久的か一時的か
恒久的なリダイレクトは将来の同じURLに対するリクエストを、そのURLへのリクエストをスキップしてリダイレクト先URLに直接リクエストを送る可能性がある。一方で一時的なリダイレクトはそのようなことはせず、毎回元のURLにアクセスしてからその応答をみて挙動を決める。よって恒久的リダイレクトはサイトの改修などでページのURLが変わった場合に、一時的リダイレクトはフォーム等のPOST後に投稿完了画面へ移動させる場合等に使う。
メソッドの変更をするかしないか
リダイレクト先のURLにリクエストを送るときに元のリクエストのメソッドを維持するものと、元のリクエストのメソッドを無視してGETでリクエストするもの、そしてどちらになるか曖昧なものがある。元のリクエストのメソッドを無視するものは、例えばフォームの投稿をPOSTメソッドでしたときに投稿完了画面へのリダイレクトをGETで行って欲しいと言う場合に使う。曖昧なものはHTTP規格上は変更しないことになっているがこれに準拠せずGETでリダイレクト先にアクセスするエージェントが存在するというもの。よって曖昧なものは元がGETリクエストである場合以外使うべきではない。
あとがき
メソッドの変更をするかどうか曖昧な301 Moved Permanently
と302 Found
はもう使わないとしてしまって良い気がする。個人的にはこれからは挙動が明確な303 See Other
、307 Temporary Redirect
、308 Permanent Redirect
のみを使うようにしたい。恒久的でGETメソッドに変更する場合がないが、そもそもそのような挙動が求められる状況が思いつかないので存在しないってことかな。