Diferencia entre los códigos de redireccionamiento HTTP

151

Las diferencias entre los diversos códigos de redireccionamiento HTTP 3XX no son claras para mí. Sí, he leído las especificaciones, pero parece haber cierta discrepancia entre la práctica estándar y la práctica real aquí.

El 301código de redireccionamiento parece lo suficientemente claro: esto significa que el recurso se movió permanentemente a otro URI, y las solicitudes futuras deberían usar ese URI.

Y el 307código de redireccionamiento también parece claro: significa que la redirección es temporal, y las solicitudes futuras aún deberían usar el URI original.

Pero no puedo decir cuál es la diferencia entre 302y 303, o por qué cualquiera de ellos es realmente diferente 301. Parece que 302originalmente estaba destinado a ser una redirección temporal , (como 307), pero en la práctica, la mayoría de los navegadores lo trataron como un 303. Pero, ¿cuál es la diferencia entre a 303y a 301? ¿Se 301supone que significa que la redirección es más permanente?

Canal72
fuente

Respuestas:

139
  • 301 : redireccionamiento permanente. Los clientes que realicen solicitudes posteriores para este recurso deben usar el nuevo URI. Los clientes no deben seguir la redirección automáticamente para las solicitudes POST / PUT / DELETE.
  • 302 : Redirigir por una razón indefinida. Los clientes que realicen solicitudes posteriores para este recurso no deben usar el nuevo URI. Los clientes no deben seguir la redirección automáticamente para las solicitudes POST / PUT / DELETE.
  • 303 : Redirigir por una razón indefinida. Por lo general, 'La operación se ha completado, continúe en otro lugar' Los clientes que realicen solicitudes posteriores para este recurso no deben usar el nuevo URI. Los clientes deben seguir la redirección para las solicitudes POST / PUT / DELETE, pero usan GET para la solicitud de seguimiento .
  • 307 : redirección temporal. El recurso puede volver a esta ubicación en un momento posterior. Los clientes que realicen solicitudes posteriores para este recurso deben usar el URI anterior. Los clientes no deben seguir la redirección automáticamente para las solicitudes POST / PUT / DELETE.

Yo personalmente recomiendo evitar 302 si tienes la opción. Muchos clientes no siguen la especificación cuando encuentran un 302. Para redireccionamientos temporales, debe usar 303 o 307, dependiendo del tipo de comportamiento que desee en las solicitudes que no son GET. Prefiere 307 a 303 a menos que necesite el comportamiento alternativo en POST / PUT / DELETE.

Bob Aman
fuente
26
No Seguir un 303 requiere reescribir el método para OBTENER. Seguir a los demás requiere mantener el método, pero confirmar con la UA si el método no es seguro (por lo tanto, los métodos son OPCIONES, HEAD, GET, PROPFIND ...)
Julian Reschke
1
@JulianReschke ¿Podría señalar lugares en las especificaciones que respaldan su declaración?
Piotr Dobrogost
77
@BobAman En su descripción, está cometiendo los mismos errores cometidos en la especificación HTTP original ( RFC 1945 ). Por ejemplo, decir que los clientes deben seguir la redirección para las solicitudes POST / PUT / DELETE. después de 303 redirigir sin especificar que el verbo http a utilizar en la siguiente solicitud debe ser GET es engañoso ...
Piotr Dobrogost
2
Corrigiéndome a mí mismo: "Seguir un 303 requiere reescribir el método para OBTENER a menos que el método inicial sea HEAD".
Julian Reschke
2
Piotr: el valor predeterminado debería ser no modificar el método; el recurso movido, eso no afecta cómo manipularlo. 303 es una excepción; no significa "el recurso se ha movido" sino "la solicitud fue procesada y aquí está su resultado"; Es un tipo de redirección completamente diferente. Ver greenbytes.de/tech/webdav/…
Julian Reschke
84

La diferencia entre 303 y 307 es esta:

303 : Ver otro. La solicitud se recibe correctamente, pero los resultados deben recuperarse utilizando un GET en la URL de redireccionamiento.

307 : redirección temporal. Toda la solicitud debe ser redirigida a la nueva url. Cualquier información de publicación debe volver a publicarse.

Tenga en cuenta que 302 estaba destinado a tener el comportamiento de 307, pero la mayoría de los navegadores lo implementaron como el comportamiento de 303 (los cuales no existían en ese momento). Por lo tanto, esos dos nuevos códigos se introdujeron para reemplazar 302.

La diferencia entre 301 y 303:

301 : el documento se mueve. Las solicitudes futuras deben usar la nueva URL. Esta url es obsoleta.

Nota: tenga cuidado con este código. Los navegadores y los servidores proxy tienden a aplicar un almacenamiento en caché realmente agresivo, por lo que si responde con un 301, alguien podría tardar mucho tiempo en volver a visitar esa URL.

303 : La solicitud se recibió correctamente. Cualquier solicitud PUT se procesa. El documento resultante se puede recuperar de la URL de redireccionamiento. La solicitud futura aún debe ir a la url original.

GolezTrol
fuente
una buena publicación de blog que entra en los detalles de 3xx (y todos los problemas con ella) está en: insanecoding.blogspot.no/2014/02/…
arcuri82
@ skeller88 ¡Tu cambio hizo que mi respuesta fuera incorrecta, así que la revertí (abucheo a las personas que aceptaron el cambio)! Introdujo el mismo error que tiene la respuesta aceptada. 303 es un tipo diferente de redireccionamiento y se aplican diferentes reglas, como lo confirman los comentarios de Julian Reschke sobre la respuesta aceptada y el blog vinculado por arcuri82
GolezTrol