301 Redirect

11 marzo 2012 at 20:38 by Adrián Pérez

Apache HTTP
Volvemos al maravilloso mundo del SEO, esta vez viendo el porqué y algunos ejemplos de cómo hacer una redirección 301 cuando se cambia una web de dominio o se diseña una nueva web que no mantiene los enlaces de la original.

301 según Google

P: ¿Qué es una redirección 301?
R: "Si necesita cambiar la forma en que aparece la URL de una página en los resultados del motor de búsqueda, le recomendamos que use un redireccionamiento 301 por parte del servidor. Es la mejor forma de asegurarse de que se redirija a la página correcta a todos los usuarios y motores de búsqueda. El código de estado 301 significa que una página se ha trasladado de forma permanente a una nueva ubicación."

Fuente: http://support.google.com/webmasters/bin/answer.py?hl=es&answer=93633

Ejemplo: Cambio de hosting y de dominio

Si se está migrando una web de un antiguo dominio a un nuevo dominio (es decir, únicamente se está moviendo la web de dominio y de hosting, sin realizar ningún cambio en el código de la web), bastará con crear un fichero .htacess en la raíz del antiguo hosting/dominio con el siguiente código:

Options +FollowSymLinks
RewriteEngine on
RewriteRule (.*) http://nuevodominio.com/$1 [R=301,L]

 

Ejemplo: Mismo hosting, mismo dominio, diferente web

Si en cambio, no se cambia ni de dominio ni de hosting, y lo único que varia es la estructura interna de la web (si por ejemplo, se crea una nueva web desde cero, totalmente diferente a la original en cuanto a estructura), se deberá hacer una redirección de las antiguas webs (ya no existentes) a sus correspondencias en la nueva web. Por ejemplo, últimamente he trabajado en montar una nueva web para Fucal, una carpintería de aluminio. Su web es www.fucal.net y no hemos cambiado de hosting ni de dominio, símplemente en el servidor, hemos creado dos directorios en la raíz, totalmente independientes uno de otro:

  • /fucal: con el código de la antigua web
  • /fucal_new: con el nuevo código

El nuevo código, además, no tiene nada que ver con el antiguo, y por lo tanto, los enlaces que anteriormente existían, tienen su correspondencia en la nueva web, pero no mantienen el formato.

Para hacerlo de forma correcta, en el la raíz del antiguo código, se deberá incluir en el .htaccess las redirecciones 301 para indicar qué nuevas páginas corresponden a las antiguas. Así por ejemplo, si se disponía de una página http://www.fucal.net/serveis.html la cual ahora ha pasado a llamarse http://www.fucal.net/productos/, se deberá crear la correspondiente redirección tal y como sigue, en el .htaccess de la raíz del site antiguo (en /fucal):

RewriteRule ^serveis.html$ http://www.fucal.net/productos/ [R=301,L]

Así, nos quedaría un .htacess en la raíz de la antigua web, que indicará las correspondencias entre la antigua y la nueva web:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^renovat.html$ http://www.fucal.net/pla-renovat-2012/ [R=301,L]
RewriteRule ^serveis.html$ http://www.fucal.net/productos/ [R=301,L]
RewriteRule ^presupost.php$ http://www.fucal.net/presupuestos/ [R=301,L]
RewriteRule ^empresa.html$ http://www.fucal.net/quienes-somos/ [R=301,L]
RewriteRule ^cat/$ http://www.fucal.net/ [R=301,L]
RewriteRule ^contactar.html$ http://www.fucal.net/quienes-somos/ [R=301,L]
</IfModule>

NOTA: Esta parte no la he probado (mal por mi parte) pero debería funcionar.

 

Ejemplo: ¿Y con WordPress?

Si la antigua web fuera un WordPress, éste ya habría generado su propio .htaccess con el siguiente código:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Para añadir las redirecciones, se deberían incluir dentro del código existente, tal y como sigue:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^renovat.html$ http://www.fucal.net/pla-renovat-2012/ [R=301,L]
RewriteRule ^serveis.html$ http://www.fucal.net/productos/ [R=301,L]
RewriteRule ^presupost.php$ http://www.fucal.net/presupuestos/ [R=301,L]
RewriteRule ^empresa.html$ http://www.fucal.net/quienes-somos/ [R=301,L]
RewriteRule ^cat/$ http://www.fucal.net/ [R=301,L]
RewriteRule ^contactar.html$ http://www.fucal.net/quienes-somos/ [R=301,L]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Ejemplo: Cambio de hosting pero conservando el dominio

Si éste es tu caso, no necesitas una redirección 301, porqué el dominio continua siendo el mismo. Únicamente necesitarás realizar el cambio en las DNS para apuntar al nuevo hosting y listo. A no ser que tengas una base de datos, en cuyo caso, no te podrás permitir estar 24-48h (de propagación del cambio en las DNS) en los cuales tendrás algunas peticiones almacenadas en la base de datos del servidor antiguo y otras en el nuevo, debido a la propagación de DNS.

Para evitar esto, tienes varias alternativas, de entre las cuales propongo 2:

1- Modificar el código del servidor original para usar la base de datos del nuevo servidor, antes empezar con la migración. De esta forma, cuando se haga el cambio DNS no importará el tiempo de propagación porqué todos los datos irán a parar al nuevo servidor.

2- En un servidor Linux, modificar iptables para redirigir todo el tráfico HTTP al nuevo servidor. Aquí las instrucciones.

 

Finalmente faltaría testear que las redirecciones efectivamente funcionen y ya podremos ir a dormir tranquilos.

Fuente: http://www.webconfs.com/how-to-redirect-a-webpage.php
Flickr! Foto por Will Weaver