HTTPステータスコード – 302 Foundと303 See Otherと307 Temporary Redirectの違いについて

HTTPステータスコードの302はMoved Temporarilyだと思っていたのですが、RFC 2616(Hypertext Transfer Protocol — HTTP/1.1)で『302 Found』に改められていました。そして、RFC 2616では『307 Temporary Redirect』というステータスコードが追加されていました。

『302 Found』と『303 See Other』と『307 Temporary Redirect』の違いについて気になったので、まとめてみました。

元々、ステータスコード302はMoved Temporarilyでした。『302 Moved Temporarily』とは、「指定したURIのリソースは、一時的に別のURIに存在しているので、そちらを参照してください」と言う意味です。もちろん一時的に別のURIに存在しているため、クライアントは今現在リクエストに使ったURIを将来に渡っても使うべきです(ここが『301 Moved Permanently』との違い)。

RFC 1945RFC 2068では、「『302 Moved Temporarily』が返された場合、リクエストに使った動詞(GETとかPOSTとか)を変更してはいけない」ということになっています。しかしながら、多くのクライアントは、元々リクエストに使った動詞に関係なく、HTTPレスポンスヘッダのLocationフィールドに指定されているURIにGET動詞でリクエストをする実装になっているようです。つまり、RFCで規定されている動作をしていないわけです。そのため『303 See Other』と『307 Temporary Redirect』が追加されたとのことです。

『303 See Other』は、「指定URIに対するリクエストのレスポンスは異なるURIに存在するので、それをGET動詞で取得するべき」と定められています。例えば「POST動詞などで新しくリソースを作成し、そのリソースをGET動詞で取得する」などの使い道が考えられます。ただ、HTTP/1.1が策定される以前に開発された多くのクライアントはステータスコード303を解さないので、それらのクライアントのために『302 Found』を使うことが考えられます。また、「HTTPレスポンスヘッダのLocationフィールドで指定されたリソースは、元々リクエストしようとしたリソースの代替ではない」という点も注意が必要です。従って、「一時的にURIが変更になったのでステータスコード303を返す」ということはしてはいけません。

『307 Temporary Redirect』とは、元々『302 Moved Temporarily』が意図していた動作を強制するために追加されました。つまり「リクエストされたURIは一時的に別のURIとなっているため、リクエストに使った動詞をそのまま使い、HTTPレスポンスヘッダのLocationフィールドに指定されているURIにアクセスするべき」と言うことです。

まとめます。GET動詞(aタグのリンクをクリックしたときなどですね)でリクエストされたリソースのURIが一時的に変更になった場合は、『302 Found』か『307 Temporary Redirect』を返すと良いでしょう。ただ、元々リクエストに使った動詞をそのまま使って、変更先のURIにリクエストして欲しい場合は『307 Temporary Redirect』を返すべきです。また、POST動詞などを使ってリソースを新規に作成し、そのリソースをGET動詞で取得してもらいたい場合は『303 See Other』を返すべきと言うことです。

2 thoughts on “HTTPステータスコード – 302 Foundと303 See Otherと307 Temporary Redirectの違いについて”

  1. 酒井様

    Redirectについてお詳しそうでしたので、一つ質問させていただいても良いですか?

    htaccessで301リダイレクトをする為、下記のように設定しました。

    Redirect permanent ○○○ ○○○
    Redirect permanentと記述したので、一時的でなく恒久的な移転が目的です。

    ところが、http://web-sniffer.net/
    で、確認したところ、

    HTTP Status Codeは、HTTP/1.1 302 Found
    と表示されました。
    これは、どのように解釈するべきでしょうか?

    ぶしつけな質問で恐縮ではございますが、ご存知でしたらアドバイスいただけないでしょうか?

  2. 状況が確認できないので何とも言えないのですが、.htaccessの情報が上書きされていると言うことはないでしょうか。
    もしくは
    RedirectPermanent / http://example.com/
    のようにRedirectPermanentディレクティブを使った場合は、どのようになるでしょうか。

Leave a Reply

Your email address will not be published. Required fields are marked *