¿Cuál es la diferencia entre los códigos de estado HTTP 301 y 308?

138

¿Cuál es la diferencia entre HTTP 301y los 308códigos de estado?

  • 301 (Movido permanentemente): esta y todas las solicitudes futuras deben dirigirse a la URI dada.

  • 308 (Redirección permanente): la solicitud y todas las solicitudes futuras deben repetirse utilizando otro URI.

Parecen ser similares.

Alexander Drobyshevsky
fuente
No hay código 308 en tools.ietf.org/html/rfc2616 y tools.ietf.org/html/rfc6585 , por lo que la pregunta debe dirigirse al inventor de este código no estándar.
KonstantinL
44
Hay especificación RFC 7538, por lo que es verdadero código HTTP
Alexander Drobyshevsky
2
Bueno, tools.ietf.org/html/rfc7538 : Nota: Este código de estado es similar al 301, excepto que no permite cambiar el método de solicitud de POST a GET.
KonstantinL
44
No use el RFC 2616 como referencia. Fue obsoleto por los RFC 7230-35.
cassiomolin

Respuestas:

258

Una visión general de 301, 302y307

El RFC 7231 , la referencia actual para la semántica y el contenido del protocolo HTTP / 1.1, define el código de estado 301(Movido permanentemente) y 302(Encontrado), que permite cambiar el método de solicitud de POSTa GET. Esta especificación también define el 307código de estado (Redirección temporal) que no permite cambiar el método de solicitud de POSTa GET.

Ver más detalles a continuación:

6.4.2. 301 Movido Permanentemente

El 301código de estado (movido permanentemente) indica que al recurso de destino se le ha asignado un nuevo URI permanente y cualquier referencia futura a este recurso debería usar uno de los URI adjuntos. [...]

Nota: Por razones históricas, un agente de usuario PUEDE cambiar el método de solicitud de POSTa GETpara la solicitud posterior. Si este comportamiento no es deseado, 307se puede usar el código de estado (Redirección temporal) en su lugar.

6.4.3. 302 encontrado

El 302código de estado (encontrado) indica que el recurso de destino reside temporalmente bajo un URI diferente. Debido a que la redirección podría ser alterada ocasionalmente, el cliente debe continuar usando el URI de solicitud efectivo para futuras solicitudes. [...]

Nota: Por razones históricas, un agente de usuario PUEDE cambiar el método de solicitud de POSTa GETpara la solicitud posterior. Si este comportamiento no es deseado, 307se puede usar el código de estado (Redirección temporal) en su lugar.

6.4.7. Redirección temporal 307

El 307código de estado (Redirección temporal) indica que el recurso de destino reside temporalmente bajo un URI diferente y el agente de usuario NO DEBE cambiar el método de solicitud si realiza una redirección automática a ese URI. Dado que la redirección puede cambiar con el tiempo, el cliente debe continuar utilizando el URI de solicitud efectiva original para futuras solicitudes. [...]

Nota: Este código de estado es similar a 302(Encontrado), excepto que no permite cambiar el método de solicitud de POSTa GET. Esta especificación no define una contraparte equivalente para 301(Movido permanentemente) ( RFC 7238 , sin embargo, define el código de estado 308 (redireccionamiento permanente) para este propósito).

La necesidad de 308

El RFC 7238 se ha creado para definir el 308código de estado (redireccionamiento permanente), que es similar a 301(movido permanentemente) pero no permite cambiar el método de solicitud de POSTa GET.

El 308código de estado ahora está definido por el RFC 7538 (que obsoleto el RFC 7238 ).

3. 308 Redirección permanente

El 308código de estado (redirección permanente) indica que al recurso de destino se le ha asignado un nuevo URI permanente y que cualquier referencia futura a este recurso debería usar uno de los URI adjuntos. Los clientes con capacidades de edición de enlaces deben volver a vincular automáticamente las referencias al URI de solicitud efectivo a una o más de las nuevas referencias enviadas por el servidor, cuando sea posible. [...]

Nota: Este código de estado es similar a 301(Movido permanentemente), excepto que no permite cambiar el método de solicitud de POSTa GET.

Se tenemos lo siguiente:

                                                             +-----------+-----------+
                                                             | Permanent | Temporary |
+------------------------------------------------------------+-----------+-----------+
| Allows changing the request method from POST to GET        | 301       | 302       |
+------------------------------------------------------------+-----------+-----------+
| Doesn't allow changing the request method from POST to GET | 308       | 307       |
+------------------------------------------------------------+-----------+-----------+

Elegir el código de estado más adecuado

Michael Kropat reunió un conjunto de cuadros de decisiones que ayudan a determinar el mejor código de estado para cada situación. Consulte los siguientes códigos de estado 2xxy 3xx:

Elegir un código de estado 2xx o 3xx

cassiomolin
fuente
3
Dado que la pregunta era específicamente sobre el destino entre 301 y 308, ¿podría dar alguna explicación más sobre: "no permite que el método de solicitud cambie de POSTa GET" ? ¿Significaría que un formulario publicado no puede ser procesado, pero un nuevo formulario nuevo podría ser servidor y luego ser publicado en una próxima solicitud?
R. Schreurs el
1
Este borrador de especificación ( tools.ietf.org/id/draft-hunt-http-rest-redirect-00.html ) sugiere que los servicios ReSTful deberían usar 308 incluso para GET. "Los códigos de redirección HTTP 301-306 NO DEBEN utilizarse a menos que el proveedor de servicios sepa que el cliente es de hecho un agente de usuario". Sin embargo, esto es solo un borrador. No estoy seguro de si / cuándo será aceptado.
Bruce Adams
1
Esta publicación, la-guía-definitiva-para-obtener-vs-publicar , aclara por qué permitir que una POSTsolicitud (segura) se cambie a a GET(insegura en que los datos se pasan agregándola a la url, y las urls se pueden guardar - incluidas las contraseñas) puede ser un problema de seguridad y, por lo general, debe evitarse, a menos que sepa que es seguro cambiarlo. En estos días parece que generalmente es compatible y prefiere usar 307, 308 sobre 301, 302. Pero debe verificarlo.
SherylHohman
1
Mnemonic 308es como un infinito lateral, por lo que la redirección permanente, y nunca cambia el método de solicitud, también es un tipo de solicitud fijo y permanente. Luego, se 307muestra el 1paso a continuación: Método de solicitud permanente / mantener (Obtener / Publicar), pero redirigir a una ubicación temporal: 7 - parece "giro a la izquierda" o desvío temporal, y 7 también es similar a k, así que "mantenga" el método de solicitud
SherylHohman
Olvidó mencionar Resume Incomplete .
Knu