2013-07-12 18 views
12

POST => 302のGETへのリダイレクトの正しい動作は何ですか?GETへのHTTP POST => 302リダイレクトの正しい動作は何ですか?

私は、(私がリダイレクトしたいリソースに)POSTした後、302のリダイレクトを受け取った後、ブラウザは自動的に302の場所でGETを発行します。これはさらにwell known patternです。しかし、私が仕様を読んでいるように、これは起こるべきではないと示唆しているようです。 302のステータスコードが GETまたはHEAD、ユーザエージェント以外の要求に応答して受信された場合、それをすることによって確認することができる場合を除き

The HTTP spec says

を自動的 要求をリダイレクトしてはいけませんユーザー、これは が要求された条件を変更する可能性があるためです。

そして、シオマネキ表示されます。

REQUEST 1: POST URLA 
RESPONSE 1: 302 redirect to URLB 
REQUEST 2: GET URLB 

上記のセクションでは、ブラウザがGET要求を行うべきではないと言っているようですか?私は何が欠けていますか?

  1. 以前
  2. このセクションは無関係になりスペックで自動的にリダイレクトの私の理解が間違っている(とGETをしたChromeブラウザをリダイレクト自動的に本当にありませんでした)何か
  3. 確認この私の理解ユーザーとして
  4. 他に何か?

答えて

13

仕様で非常に次の行が始まります。

注:RFC 1945およびRFC 2068クライアントがリダイレクトされたリクエストのメソッドを変更することが を許可されていないことを指定します。しかしながら、多くの場合、 の既存のユーザエージェント実装は、それが303 レスポンスであるかのように302を扱い、元のリクエストメソッドの にかかわらず、ロケーションフィールド値に対してGETを実行する。ステータスコード303と307は、 種類の反応がクライアントに期待されることを明白に明示したいサーバーに対して、 が追加されています。

そしてその直後に、303がどのように処理されるべきかが説明されています。それはあなたが見ているものです。


サーバはまだ現在のすべてのブラウザが正しく処理する302の代わりに307を使用している理由を求めている場合は、古いブラウザでは、それを処理しないので、それはです。ブラウザが303を302として扱う理由が不思議であれば、それは古いサーバーが期待しているからです。実際には、そのループから脱出する方法はまったくありません.HTMLでは、302を元の意味に戻し、307の代わりにGET/HEAD以外のものを非推奨にする方がよいでしょう。

+1

abarnet:あなたは "古いブラウザ" によって何を意味するのか明確にしてください - >応答POST/formHandler:

次に、あなたは

要求を持っています。 –

+0

@JulianReschke:私は正確には分かりません。私が推測しなければならないのは、ビンテージがIE6とFF 1.9の周りにあると思います。しかし、デスクトップブラウザ(およびWebKitモバイルブラウザ)だけがそこにいるユーザエージェントではないことに注意してください。 – abarnert

+0

@JulianReschke:303と307はHTTP/1.1のみであると言わざるを得ないでしょう。 1.1を扱うことができないサーバーやキャッシュ(そしていくつかのユーザーエージェント)があります。また、無効にすることもできます。その間、私は[blog post]を見つけました(http://blogs.msdn.com/b/ieinternals/archive/2011/08/19/understanding-the-impact-of-redirect-response-status-codes-on- http-methods-like-head-get-post-and-delete.aspx)を使用します。 – abarnert

0

abarnertが正しくありました。 Google App Engineで同じ問題が発生しましたが、別の解決策が見つかりました。

私のappengineの問題は、私はバックエンドのGO formHandlerにフォームを使ってPOSTを行いました。しかしそれは以下のように実行されました。

要求1: - :実測値302

要求1:GET/formHandler>レスポンス1 POST/formHandler - >レスポンス1:302実測

要求1:GET/formHandler - >レスポンス1:200 OK。

がAdditionaly、私は

を得ない「アクセス制御 - 許可 - 起源」ヘッダは、CORSの問題だった、要求されたリソース

上に存在しています。

しかし、HTTPの代わりにHTTP Sを使用することが判明しました。 200 OK

関連する問題