2012-03-28 13 views
10

私は簡単なCRUDアプリケーションでダブル投稿を避けるためにpost/redirect/getパターンを実装したウェブページを持っています。ポストリダイレクト - Internet Explorerで入手

意図要求/応答シーケンスはここにある:

  1. ブラウザはPOST
  2. サーバを介してデータを送信ステータス302 Moved Temporarilyで応答し、
  3. ブラウザはGET
  4. 介してリダイレクトを以下 Locationヘッダ、DBを変更
  5. サーバーは更新されたページで応答します

これは、Chromeでの動作の仕組みです。

しかし、Internet Explorer 9では、ステップ3がPOSTとして送信されます(フォームデータの完全なセットを含む)。どうして? GETを使用するにはどうすればよいですか?

リダイレクトは、クエリ文字列とは別に、フォームターゲットと同じ場所に追加する必要があります。

私が試してみた:レンダリングモード(IE7、IE8、IE9、癖、標準のcompat)のすべての利用可能な

  • フルDOCTYPE
  • 相対URLまたは絶対1でもしLocationヘッダ
  • HTTPステータス303(すなわち、任意の違いを行う場合だけを参照する)
+0

最も単純な例が可能で、DOCTYPEは全くありません。IE9が実際に2回目の同じPOST要求を送信していることを3倍していますか?途中でプロキシやその他何もありませんか? – Jon

+0

さて、デバッガのネットワークタブを見ると、これが私に伝えられます。サーバーはPOSTも受信します。 HTTP/1.1状態の場合は – Tomalak

+3

RFC 2616、[状態コード定義](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html)の場合は10.3.3節で、ブラウザが '302'レスポンスは使用されているメソッドを変更しないでください* POSTはPOSTのままでなければなりません。 IEは実際にそれを正しく行っています。しかし、 '303' *はGETになるはずなので、IEはあなたの最後の箇条書きによれば*間違っています。 –

答えて

4

正しいステータスコードあなたはGETがであることを望んでいますが、301と302は一般的なブラウザでもやっています。

これが機能しない場合は、おそらく何か間違っていると思われます。 HTTPトレースは、何が間違っているかを見つけるのに役立ちます。

+0

明日はそれを供給します。 – Tomalak

3

IE9はリダイレクト30x後に実際に "POST"を送信しないようですが、内部デバッガに表示されます。

+2

OPと同じ問題があるかどうかは分かりませんが、非常によく似ています(ポストリダイレクト - IE9を取得)。私はちょうどそれが私の場合のデバッガであることを確認しました。 –

+0

私も同様です。 IE9モードでは、Network devパネルにはPOST-> POST for 303が表示されますが、サーバーはPOST-> GETを受信して​​いると言います。 :( – Ashley

2

私は同様の動作に気づいた。 IE11の内部デバッガはPOSTを報告していましたが、サードパーティ製のアプリケーション(Fiddler)を使用してリクエストをGETとして報告しました。 303/302に応答してPOSTが表示されている場合は、外部アプリでそれを再度チェックしてください。