respuesta - HTTP: la solicitud POST recibe un 302, ¿debería la solicitud de redireccionamiento ser un GET?
redirect 301 htaccess (4)
Acabo de buscar el código relevante en Chrome, y here está:
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;
}
Estaba leyendo this pero realmente no obtuve de allí qué tipo de solicitud debería tener la solicitud de redirección en qué caso, es decir, la función (tipo de solicitud inicial, tipo de respuesta) -> tipo de solicitud de redirección.
En mi caso particular, tuve:
- tipo de solicitud inicial: POST
- tipo de respuesta: 302
Google Chrome utilizó un GET para la solicitud redirigida.
En las requests biblioteca de Python, hay el siguiente código ( 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
Es decir, el tipo de solicitud de redireccionamiento es GET en el caso de 303 ( codes.see_other
), en todos los demás casos es el tipo de solicitud inicial. Es decir, para mi caso particular anterior, sería POST, a diferencia de Chrome.
Probablemente esto sea incorrecto porque tengo un sitio web en el que realmente no parece funcionar correctamente (es decir, el sitio web no se comporta bien de esta manera).
¿Cuál sería la forma / función correcta?
Con excepción de 303 y 307, cualquiera de los comportamientos es aceptable según la spec , principalmente por razones históricas.
Pensé en cuál era la respuesta a esta pregunta después de experimentarla con Chrome y las solicitudes de nodos, y al principio asumí que era totalmente normal. Entonces pensé que si bien puede ser "histórico", probablemente no fue "correcto". Así que encontré esta página, y parece que ser "correcto" es menos importante que ser compatible con implementaciones "históricas" ... que sonaron decepcionantes por un minuto. Luego recordé que cada "tradicional", no Ajax / API, basado en la forma "POST" que he visto responde con un redireccionamiento que asume un GET.
Es lo que es y eso probablemente no cambie nunca. Gracias a todos los que respondieron anteriormente por proporcionar toda la información relevante.
Según RFC 2616, la respuesta es "el método original". HTTPbis revisará esto, ya que no refleja lo que hacen los navegadores (por desgracia).
Vea http://trac.tools.ietf.org/wg/httpbis/trac/ticket/160 para la historia.