19585


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


CC BY-SA 3.0
2015-12-03T02:32:03.777
19581
2015-12-05T07:30:31.470
2015-12-05T07:30:31.470
46
9149
question
php
post後にリダイレクトするときは301?302?


**303 See Other**

> リクエストに対するレスポンスが他のURLに存在するときに返される。Location:ヘッダに移動先のURLが示されている。  
>
> リクエストしたリソースは確かにそのURLにあるが、他のリソースをもってレスポンスとするような場合に使用する。302の説明で挙げたような、掲示板やWikiなどで投稿後にブラウザを他のURLに転送したいときに使われるべきコードとして導入された。

[Wikipediaより](https://ja.wikipedia.org/wiki/HTTP%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89#3xx_Redirection_.E3.83.AA.E3.83.80.E3.82.A4.E3.83.AC.E3.82.AF.E3.82.B7.E3.83.A7.E3.83.B3)


CC BY-SA 3.0
2015-12-03T03:36:42.840
19584
2015-12-03T04:33:41.280
2015-12-03T04:33:41.280
13291
19581
answer


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

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は意味的にも全然違いますしね。)


CC BY-SA 3.0
2015-12-03T03:50:23.063
19585
2015-12-03T03:50:23.063
2017-05-23T12:38:55.250
-1
2808
19581
answer


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)


CC BY-SA 3.0
2015-12-03T03:58:13.843
19586
2015-12-03T03:58:13.843
2017-05-23T12:38:55.307
-1
8000
19581
answer


301(恒久的)も302(一時的)もコンテンツ(URL)自体が移動している時に使います。  
質問文を読解するとPOSTを受けるURLは変わっていない様子なので、どちらも違います。

**POST後の完了画面が別のURLにある場合は303(See Other)で移動します。**

> 303はリクエスト先としては正しく、そのURLにアクセスする必要が有るが、  
>  そのレスポンスは他のURLにあるリソースを参照する場合を意味します。

他の方の回答でされている「302を使う」という解答については  
303に対応していないブラウザ(ガラケーの古い機種等)が一般的に存在した時代の代替策です。

10年以上前であれば100点満点の解答ですが、  
プロバイダー、N/W高速化サービス、ルーター、キャッシュサーバから検索ロボット等といった  
様々なものがここを解析して動作を変えています。

中にはリダイレクト自体を長期間キャッシュしてしまうサーバーが存在するので  
今となっては余計なトラブルのもとに成りかねません。


CC BY-SA 3.0
2015-12-03T11:15:24.257
19598
2015-12-03T11:15:24.257
9262
19581
answer


いわゆる「Redirecting After Post」パターンでのことを質問されていると思いました。

古いブラウザ対応のために301,302を返す実装は今でもあるとは思いますが、現在の仕様ならば308かも知れません。

<https://developer.mozilla.org/en-US/docs/Web/HTTP/Response_codes>


CC BY-SA 3.0
2015-12-03T12:22:05.823
19600
2015-12-03T12:22:05.823
5778
19581
answer