post後にリダイレクトするときは301?302?


登録フォームなどで、post後に完了ページにリダイレクトする時のhttpステータスは301と302どちらが正しいのでしょうか。




本来どうあるべきか、というのは他の方の回答に譲るとして、既存フレームワーク(実装や仕様)のデフォルトに合わせておけば良かろうという後ろ向きな考え方もあるかと思います。

SO本家にも同様の質問がありました([After a POST, should I do a 302 or a 303
redirect?](https://stackoverflow.com/questions/5129076/after-a-post-should-i-
do-a-302-or-a-303-redirect))が、そのやりとりの中ではフレームワークのデフォルト挙動は[いずれも
**302**](https://stackoverflow.com/a/5129154/4506703)ということが挙がっていました。

301か302かのどちらかでなければならない、ということであれば302でしょう。  
(そもそも301は意味的にも全然違いますしね。)




301 Moved Permanently の場合、以前URL-AにあったものはURL-Bに恒久的に移転され、もはやURL-
Aでアクセスすることはない、といった意味合いになります。

今回の場合、POST先としてはURL-Aで正しいのですから、301リダイレクトは適切ではありません。

一時的な移転を表す 302 を使いましょう。

* * *

もっとも、302 リダイレクトは本来、POST先が一時的に移転した場合（リダイレクト先にPOSTしなおしてほしい）に使うものとして作られました。このため、

  * 303 See Other （要求したリソースは確かにそこにあるが、レスポンスは他をGETしてほしい）
  * 307 Temporary Redirect （要求したリソースは一時的に移転している＝POST等もそのまま）

というステータスコードが HTTP 1.1 で新設されました。

これまで慣例的に行われてきた 302 の挙動が 303 に引き継がれたので、これらは同じ挙動になります。HTTP 1.1
を正しく解釈しない古いブラウザも考えると 302 を使った方が無難、とされています。

まあ今時 303 を解釈できないブラウザなんて稀だと思いますが・・・。

参考

  * [リダイレクト時のステータスコードには何を使えばいいか？ | 株式会社シンメトリック公式ブログ |](http://www.symmetric.co.jp/blog/archives/123)  
ガラケーが303等を解釈するかといった情報が載っていますが、303を解釈しないとして挙げられている iモードブラウザ1.0
は[TLS1.0にも対応していない](http://qiita.com/harukasan/items/dee779c0a3f624758230)ので、もういいかなという感じ。

  * [After a POST, should I do a 302 or a 303 redirect? - Stack Overflow](https://stackoverflow.com/q/5129076/2818869)

