Webサービスによるリダイレクトのステータスコードは何を使えば良いか

アクセスしてきたユーザーを別のページに飛ばすリダイレクト処理をするためのステータスコードは301と302の2種類がある。

指定のURLに飛ばすという基本的な機能自体は同じだが、301は永続的な移動(サイトの移転など)を表し、302は一時的な移動を表す。

これに何の違いがあるかというと、Googleなどの検索エンジンがこれを参考にページの優先順位を判断するので、301にしておくと移転先にも今までのページのランクが引き継がれるというメリットがある。

というケースなら使い分けはできるのだが、そうではなく、ひとつのWebサービスの中で特定の条件下で特定のページに飛んだら別のページにリダイレクトさせたいことはよくある。

これは一時的な移動とも永続的な移動とも言えず、検索エンジンのことも関係ないので、301と302のどちらにすればよいか悩む。

結論から言うと、302にすれば良いらしい。

Chromeでウェブ開発:301転送キャッシュの対応。 | WWWクリエイターズ
Google Chromeを使った開発と、301リダイレクトのキャッシュの影響による、陥りやすい罠についてです。 htaccessと301転送(リダイレクト) Web開発者の多くはApacheでhtaccessを設定する事も多と思います。特に、サイトの引っ越しにおいては、HTTP Status Code「301 (Mo...

301は永続的な移動なので、その後の変更がないとみなされキャッシュされ、次にアクセスした時にキャッシュが利用される。

302はChromeの仕様ではキャッシュされないので、条件によってはリダイレクトしたくない場合など、302でなければ期待通りの動作をしない。

実際の事例を見てみても、302が使われているケースしか見つからなかった。

Ruby on Rails のリダイレクトも、設定をしなければ基本的に302が使われるし、たとえばGoogleにログインすると裏で色々とリダイレクトが走るが(YouTubeなどとのSSOの関係上だと思われる)、これも302のリダイレクトが使われている。

なので、とりあえず302にしておけば良さそうだし、もし思うように動かなければステータスコードが301になっていることを疑った方が良さそう。

なお、No-cache というヘッダをつけるとキャッシュしないようにコントロールできるが、それをつけても301 の場合は必ずキャッシュするようになっているらしいので注意。

Note that HTTP 301 is Moved Permanently so caching the response is perfectly allowed. If you don’t want the response to be cached, try 302 or 307.

https://superuser.com/questions/304589/how-can-i-make-chrome-stop-caching-redirects#comment1192299_304600