Si se cambia de dirección a una página web o se quiere redigir a los navegantes, lo mejor es utilizar una redirección permanente (redirección 301). Con esta redirección se le indica a los buscadores que se ha cambiado de dirección. También puede ser muy útil si se cambia el nombre de los ficheros.
También es importante para obtener una buena posición de una web debido al problema de la “URL canónica“.
La solución más simple es añadir la redirección 301 directamente al código de nuestras páginas (ver aquí para hacerlo en PHP, ASP, ASP.NET y Coldfusion). Sin embargo, podemos utilizar el módulo mod_rewrite de Apache en el que podríamos especificar patrones para hacer la dirección de nuestras nuevas URLs sin tener que hacer los cambios en cada archivo de código.
Las modificaciones a realizar se debería hacer sobre ficheros .htaccess que existen en cada directorio que quieras configurar.
Redireccionando archivos y directorios específicos de un dominio a otro
Necesitamos redireccionar desde un viejo dominio a uno nuevo preservando los nombres de los archivos. Por ejemplo:
Redireccionar: http://www.midominio.com/somefile.php
a: http://www.nuevodominio.com/somefile.php
La solución es añadir la siguiente directiva:
RedirectMatch 301 /(.*) http://www.nuevodominio.com/$1
La expresión regular /(.*) le indica a Apache que encuentre la carpeta raíz seguida por cero o más caracteres. Encerrando .* entre paréntesis, le dice a Apache que guarde la cadena de caracteres encontrada para ser colocada al final de la url donde nos dirigiremos, en nuestro caso, $1.
Redirección sin preservar el nombre de archivo
Algunos archivos que existen en el viejo dominio no queremos que se encuentren en el nuevo. En lugar de preservar el nombre del fichero (lo que daría lugar a un error 404 al no encontrarlo) redireccionaremos los viejos archivos a la URL raíz del nuevo dominio.
Redireccionar: http://www.midominio.com/someoldfile.php
a: http://www.nuevodominio.com/
La solucción es añadir:
RedirectMatch 301 /someoldfile.php http://www.nuevodominio.com
Omitiendo cualquier paréntesis, todos los resultados para /someoldfile.php serán redirigidos a la URL raíz de http://www.nuevodominio.com
Redireccionando la cadena GET
Algunos de nuestros scripts PHP tienen diferentes nombres pero la cadena GET será la misma. Necesitamos redirigir a nuestros visitantes a los nuevos scripts PHP manteniendo esta cadena GET. La cadena GET es un conjunto de caracteres que se encuentran al final del nombre del archivo en una URL y que son usados para pasar datos a la página web. Un ejemplo de cadena GET en una URL http://www.midominio.com/file.php?this=that&foo=bar sería “?this=that&foo=bar”.
Redireccionar: http://www.midominio.com/categorydetail.php?CAT_ID=12345
a: http://www.nuevodominio.com/artcat.php?CAT_ID=12345
La solución es añadir:
RedirectMatch 301 /categorydetail.php(.*) http://www.nuevodominio.com/artcat.php$1
Otra vez la expresión regular (.*) le indica a Apache que encuentre uno o más caracteres y los guarde para utilizarlos después para sustituir a $1.
Redireccionando mientras cambiamos la extensión de los archivos
Tenemos un directorio de archivos en el viejo dominio en el que hay mezclados tanto HTML como PHP. En el nuevo, sólo queremos que hay PHP por lo que necesitamos que los viejos HTML se modifiquen con la nueva extensión
Redireccionar: http://www.midominio.com/guide/anyfile.html
a: http://www.nuevodominio.com/articles/anyfile.php
Redireccionar: http://www.midominio.com/guide/anyfile2.php
a: http://www.nuevodominio.com/articles/anyfile2.php
La solución es añadir:
RedirectMatch 301 /guide/(.*)\.(php|html) http://www.nuevodominio.com/articles/$1.php
(.*) encuentra cero o más caracteres y los guarda para sustituirlos por $1. \.(php|html) le dice a Apache que encuentre un punto seguido por “php” o “html” y lo guarde como $2 (aunque no la estamos usando en el ejemplo). Indicamos que tenemos que escapar el punto con una barra invertida. Esto asegura que Apache no interprete el punto como “cualquier caracter” sino como un punto. Encerrando “php” y “html” entre parentesis y separándolos con un pipe “|” le indica que debe de buscar sólo uno de estos valores. Por tanto, si pusieramos (php|html|css|js|jpg|gif) en la expresión regular nos buscaría cualquier archivo con extensiones php, html, css, js, jpg o gif.
Redireccionando URLs canónicas
Necesitariamos redireccionar cualquier petición que no empieza con www.misitio.com para asegurarnos de que incluyen el www.
Redireccionar: http://misitio.com/
a: http://www.misitio.com/
Redireccionar: http://mail.misitio.com/
a: http://www.misitio.com/
Redireccionar: http://misitio.com/somefile.php
a: http://www.misitio.com/somefile.php
Lo solucionamos añadiendo:
RewriteCond %{HTTP_HOST} !^www\.misitio\.com
RewriteRule ^/(.*) http://www.misitio.com/$1 [R=301,L]
Esta directiva le dice a Apache que examine el servidor que el visitante esta accediendo (en este caso: misitio.com), y si éste no es igual a www.misitio.com les redirige a www.misitio.com. La exclamación (!) delante de www.misitio.com niega la comparación, diciendo “si el servidor NO ES www.misitio.com, entonces ejecuta RewriteRule.” En nuestro caso, RewriteRule les redirige hacia www.misitio.com mientras mantiene el nombre del mismo archivo al que estaban accediendo.
Puedes ver el artículo original en inglés en Guide to Applying 301 Re-Directs with Apache.
Más información:
- Redirección permanente: redirecciones 301
- Sobre la URL canónica
- URL canónica. La “canonicalización” de Google y redireccionamientos 301
- Redirección de la url canónica con o sin www
- ¿Qué son las URLs canónicas?
Actualización: Para que podais ver un caso práctico de la Redirección 301. Estaba viendo las estadísticas del blog y me he encontrado que había tenido una visita mediante Google con la cadena “web 2.0 iconos comparacion” y salía en el número 1. Bien, pues como estoy empezando en esto del blogging, estoy haciendo continuas modificaciones sobre el blog y una de ellas fue modificar el permalink con lo que cambiaba la dirección a los artículos que escribía. Como Google me había indexado el artículo con la dirección anterior, si se pinchaba sobre el resultado de la búsqueda, al visitante le aparecía un error indicándole que no encontraba la página, con lo cuál esto se traducía en una visita menos. Una ligera modificación al archivo .htaccess y asunto solucionado :), el visitante será redirigido al enlace correcto. Lo malo es que ya perdí a ese visitante U_U.
