Redirección HTTP: 301 (permanente) frente a 302 (temporal)


381

¿Se supone que el cliente se comporta de manera diferente? ¿Cómo?


RFC 2616 - Códigos de estado HTTP Podría repetir todo allí, pero lo dice con bastante claridad;)
Tiemen

2
Vale la pena señalar que la especificación también proporciona códigos de estado 303 y 307 para redireccionamientos temporales más matizados.
Patrick McElhaney

303 y 307 ya no son realmente necesarios. Se suponía que 303 especificaba que la nueva URL está relacionada pero no es equivalente, y debería cargarse con GET incluso si la solicitud actual era POST, pero los navegadores también lo hacen con 302 de todos modos. Se suponía que 307 especificaba explícitamente que la redirección es temporal en comparación con 302 que no especificaba si era temporal, pero los navegadores y rastreadores tratan 302 como temporal de todos modos.
thomasrutter

Respuestas:


569

El estado 301 significa que el recurso (página) se mueve permanentemente a una nueva ubicación. El cliente / navegador no debe intentar solicitar la ubicación original, sino utilizar la nueva ubicación a partir de ahora.

El estado 302 significa que el recurso se encuentra temporalmente en otro lugar, y el cliente / navegador debe continuar solicitando la url original.


12
Gracias. ¿Significa esto que si uso una redirección 301 (permanente), el cliente puede decidir no recuperar nunca más la ubicación anterior y, en su lugar, usar siempre directamente la nueva URL?
flybywire

18
¡Exactamente! De hecho, según las especificaciones, el cliente DEBE ir siempre a la nueva ubicación.
Philippe Leybaert

77
Pero en un navegador, ¿cómo afecta esto? ¿Reescribir el historial en el botón Atrás, por ejemplo, para evitar volver al incorrecto en un 301? ¿Alterar silenciosamente un marcador sobre 301 si hace clic en uno antiguo?
Xavi Montero

99
@XaviMontero La mayoría de los navegadores modernos almacenan en caché los 301 y no se molestarán en solicitar la fuente original por hasta 6 meses
Jon

34
Truco para recordar los códigos de estado HTTP 301-> Perm y 302-> Temp Redirect Two comienza con T, igual que Temporal comienza con T.
ScottCate

108

Cuando una araña del motor de búsqueda encuentra el código de estado 301 en el encabezado de respuesta de una página web, entiende que esta página web ya no existe, busca el encabezado de ubicación en respuesta, elige la nueva URL y reemplaza la URL indexada con la nueva y también transfiere el pagerank .

Por lo tanto, el motor de búsqueda actualiza todas las URL indexadas que ya no existen (301 encontradas) con la nueva URL, esto retendrá el tráfico de su página web anterior, el pagerank y lo desviará a la nueva (no perderá el tráfico de la página web anterior).

Navegador: si un navegador encuentra el código de estado 301, almacena en caché la asignación de la URL anterior con la nueva URL, el cliente / navegador no intentará solicitar la ubicación original, sino que usará la nueva ubicación de ahora en adelante a menos que se borre la memoria caché.

ingrese la descripción de la imagen aquí

Cuando una araña del motor de búsqueda encuentra el estado 302 de una página web, solo redirigirá temporalmente a la nueva ubicación y rastreará ambas páginas. La URL de la página web anterior todavía existe en la base de datos del motor de búsqueda y siempre intenta solicitar la ubicación anterior y rastrearla. El cliente / navegador seguirá intentando solicitar la ubicación original.

ingrese la descripción de la imagen aquí

Lea más sobre cómo implementarlo en asp.net c # y cuál es el impacto en los motores de búsqueda: http://www.dotnetbull.com/2013/08/301-permanent-vs-302-temporary-status-code-aspnet -csharp-Implementation.html


35

En su mayoría, 301 vs 302 es importante para la indexación en los motores de búsqueda, ya que sus rastreadores tienen esto en cuenta y transfieren PageRank cuando usan 301.

Vea la respuesta de Peter Lee para más detalles.


20

301 es que al recurso solicitado se le ha asignado un nuevo URI permanente y cualquier referencia futura a este recurso debe hacerse utilizando uno de los URI devueltos.

302 es que el recurso solicitado reside temporalmente bajo un URI diferente.

Dado que la redirección puede ser alterada ocasionalmente, el cliente debe continuar usando el URI de solicitud para futuras solicitudes.

Esta respuesta solo se puede almacenar en caché si se indica mediante un campo de encabezado Cache-Control o Expires.


1
Entonces 301 tiene sentido, pero me está costando encontrar un buen ejemplo de uso para 302 .
Bob Stein

44
@ BobStein-VisiBone, por ejemplo, de la redirección 302: cree un archivo old.php con el código <?php header("location: http://example.com/new.php"); ?>y el archivo new.php, <?php echo 'I am new'; ?>y vaya al enlace . Allí redirigirá y mostrará el texto "Soy nuevo". Luego reemplace el código en old.php <?php echo 'I am old'; ?>y también vaya al enlace . Verá el texto "Soy viejo". Si ha realizado la redirección 301 en old.php, habría visto el texto "Soy nuevo" incluso después de los cambios en el código de old.php.
Apóstol

2
@ BobStein-VisiBone Tengo una página que está en desuso y no se puede mostrar. Necesitamos hacer una nueva página pero no estaremos listos por un tiempo. Usamos un redireccionamiento temporal a una página existente que nos resulta útil para los visitantes. Una vez que se crea la nueva página, usaremos una redirección permanente a ella.
EddieC

44
302 es útil si su URL de destino depende del estado.
Brian

77
Ahora ha pasado un tiempo, pero aquí hay un buen ejemplo. Los webcomics suelen tener una url que conduce al último cómic. Si es así webcomic.com/latesty se redirige a webcomic.com/some-comic-titleun 301, el navegador siempre redirigirá a "some-comic-title". Incluso cuando el próximo cómic ha sido publicado y "último" ahora redirige a "otro título de cómic" ... Aquí es donde un 302 sería mejor.
hsan

17

Las redirecciones 301 se almacenan en caché de forma indefinida (al menos por algunos navegadores).

Esto significa que si configura un 301, visite esa página, no solo será redirigido, sino que esa redirección se almacena en caché.

Cuando vuelves a visitar esa página, tu navegador * ni siquiera se molesta en solicitar esa URL, solo va al objetivo de redireccionamiento en caché.

La única forma de deshacer un 301 para un visitante con esa redirección en la caché es redirigir de nuevo a la URL original **. En ese caso, el navegador notará el bucle y finalmente solicitará realmente la URL ingresada.

Obviamente, esa no es una opción si decidió 301 a Facebook o cualquier otro recurso que no está completamente bajo control.

Desafortunadamente, muchos proveedores de alojamiento ofrecen una función en su interfaz de administración llamada simplemente "redirección", que hace una redirección 301. Si está usando esto para redirigir temporalmente su dominio a Facebook como una página próximamente, básicamente está jodido.

* al menos Chrome y Firefox, de acuerdo con ¿Por cuánto tiempo los navegadores almacenan en caché los HTTP 301? . Solo lo probé con Chrome 45. Editar: Safari 7.0.6 en Mac también se almacena en caché, un reinicio del navegador no ayudó (Link dice que en Safari 5 en Windows sí ayuda).

** Probé javascript window.location = '', porque sería la solución que podría aplicarse en la mayoría de los casos, no funciona. Resulta en un bucle infinito no detectado. Sin embargo, PHP header('Location: new.url')rompe el ciclo

En pocas palabras : solo use 301 si está absolutamente seguro de que nunca volverá a usar esa URL. Por lo general, nunca en el directorio raíz (example.com/)


7

El principal problema con 301 es que el navegador almacenará en caché la redirección incluso si la desactivó desde el nivel del servidor.

Siempre es mejor usar 302 si habilita la redirección para una breve ventana de mantenimiento.


Definitivamente no es un "problema"; es solo cómo está destinado a funcionar. Redirigir HTTP a HTTPS, Redirigir un sitio web abandonado a uno nuevo, etc., son algunos de los usos habituales de 301.
HosseyNJF
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.