Diferencia entre los códigos de redireccionamiento HTTP

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

El código de redireccionamiento 301 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 código de redireccionamiento 307 también parece claro: significa que el redireccionamiento es temporal, y las solicitudes futuras aún deberían usar el URI original.

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

  • 301 : Redirección 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 : redirige por una razón indefinida. Los clientes que realicen solicitudes posteriores de 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 : redirige 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 de este recurso no deben usar el nuevo URI. Los clientes deben seguir el redireccionamiento para las solicitudes POST / PUT / DELETE, pero usan GET para la solicitud de seguimiento .
  • 307 : redirección temporal. El recurso puede regresar a esta ubicación en un momento posterior. Los clientes que realicen solicitudes posteriores de 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 puede elegir. Muchos clientes no siguen las especificaciones cuando encuentran un 302. Para los 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 necesites el comportamiento alternativo en POST / PUT / DELETE.

La diferencia entre 303 y 307 es esta:

303 : Ver otros. La solicitud se recibe correctamente, pero los resultados se deben recuperar usando un GET en la URL de redireccionamiento.

307 : redirección temporal. Toda la solicitud debe redirigirse a la nueva url. Todos los datos de la publicación deben 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 (ninguno de los cuales existía en ese momento). Por lo tanto, esos dos nuevos códigos fueron introducidos 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 proxies tienden a aplicar un almacenamiento en caché realmente agresivo, por lo que si respondes con un 301, puede llevar un tiempo largo para que alguien revise esa url.

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