2011-11-15 15 views
16

私はthisを読んでいましたが、リダイレクト要求がどのような場合に必要であるか、つまり、機能(初期要求タイプ、応答タイプ)→リダイレクト要求タイプのどの要求タイプであるかは実際にはありませんでした。HTTP:リダイレクト要求がGETの場合、POST要求は302を受信しますか?

は私の特定のケースでは、私が持っていた:

  • 最初のリクエスト型を:POST
  • 応答型:302

Google ChromeはリダイレクトされたリクエストのためにGETを使用していました。 Pythonライブラリrequests

、次のコード(here)がある。

# http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.4 
if r.status_code is codes.see_other: 
    method = 'GET' 
else: 
    method = self.method 

すなわちリダイレクト要求型303(codes.see_other)の場合にはGETであるが、他のすべての場合にそれは最初のリクエストタイプ。つまり、上記の私の場合は、Chromeとは対照的にPOSTになります。

これは実際には正しく動作していない1つのウェブサイト(このウェブサイトはこのようにうまく動作しません)があるため、間違っている可能性があります。

正しい方法や機能は何ですか?

答えて

8

、答えは「元のメソッド」です。 HTTPbisはこれを修正します。ブラウザが(悲しいことに)何をするかを反映していないからです。

履歴はhttp://trac.tools.ietf.org/wg/httpbis/trac/ticket/160を参照してください。

1

303と307を除いて、主に歴史的な理由から、いずれの動作もspecに従って許容されます。

+1

すべてのブラウザが異なる動作をしており、ウェブサイトがそのように動作しないように見える場合は、仕様を厳守しない方が賢明でしょうか? – Albert

+0

さて、厳密に仕様を守り、すべてのブラウザのベンダーが仕様を尊重することが賢明でしょうか? –

+0

仕様はここでは寛大です。 –

14

私はChromeで関連するコードを探し、そしてhereそれは次のとおりです。RFC 2616パー

std::string ComputeMethodForRedirect(const std::string& method, 
            int http_status_code) { 
    // For 303 redirects, all request methods except HEAD are converted to GET, 
    // as per the latest httpbis draft. The draft also allows POST requests to 
    // be converted to GETs when following 301/302 redirects, for historical 
    // reasons. Most major browsers do this and so shall we. Both RFC 2616 and 
    // the httpbis draft say to prompt the user to confirm the generation of new 
    // requests, other than GET and HEAD requests, but IE omits these prompts and 
    // so shall we. 
    // See: 
    // https://tools.ietf.org/html/draft-ietf-httpbis-p2-semantics-17#section-7.3 
    if ((http_status_code == 303 && method != "HEAD") || 
     ((http_status_code == 301 || http_status_code == 302) && 
     method == "POST")) { 
    return "GET"; 
    } 
    return method; 
} 
0

私はこの質問に対する答えがChromeとノード要求で経験した後で、それが完全に正常であると仮定していたと考えました。それで「歴史的」かもしれないが、おそらく「正しい」とは思わなかった。だから私はこのページを見つけました。そして、 "正しい"ということは、 "歴史的な"実装との互換性よりも重要ではないと分かりました。それから、私が今までに見たフォームベースの "POST"が、GETを想定したリダイレクトで応答することを思い出しました。

それはそれであり、これはおそらく変わらないでしょう。すべての関連情報を提供してくれたすべての従業員に感謝します。

関連する問題