web-dev-qa-db-ja.com

HTTP:POSTリクエストは302を受信しますが、リダイレクトリクエストはGETである必要がありますか?

私は読んでいました this しかし、どのような場合にリダイレクト要求が持つべき要求タイプ、つまり関数(初期要求タイプ、応答タイプ)->リダイレクトをそこから実際に取得しませんでした-リクエストの種類。

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

  • 初期リクエストタイプ:POST
  • 応答タイプ:302

Google ChromeはリダイレクトされたリクエストにGETを使用しました。

Pythonライブラリ リクエスト には、次のコードがあります( ここ ):

# 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)の場合、redirect-request-typeはGETであり、それ以外の場合はすべて、最初のrequest-typeです。つまり、上記の私の特定のケースでは、Chromeとは対照的にPOSTになります。

これはおそらく間違っています。これは、これが実際には正しく機能していないように見えるWebサイトが1つあるためです(つまり、Webサイトがこのようにうまく動作しない)。

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

16
Albert

RFC 2616によると、答えは「元の方法」です。 HTTPbisはこれを修正します。これは、ブラウザーの機能を反映していないためです(悲しいことに)。

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

7
Julian Reschke

Chromeで関連するコードを検索したところ、 ここ 次のようになりました。

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;
}
20
Albert

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

1
Simon Richter

Chromeとnode-requestsで体験し、最初は完全に正常だと思った後、この質問に対する答えは何かと思いました。それから、「歴史的」かもしれないと思いましたが、おそらく「正しい」ではなかったので、このページを見つけました。「正しい」ことは、「歴史的な」実装との互換性よりも重要ではないようです...少しがっかりしました。それから、すべての「従来の」、非Ajax/API、フォームベースの「POST」私が今まで見たことがありますが、GETを想定したリダイレクトで応答します。

それはそれが何であるかであり、それはおそらくこれまで変わらないでしょう。すべての関連情報を提供してくれた以前のすべてのレスポンダーに感謝します。

0
cwnewhouse