Redirección permanente de páginas

Si llevas ya un tiempo trabajando en proyectos web, seguramente te habrá tocado más de una vez actualizar un web a una nueva versión, o cambiar una sección de una url a otra, dentro o fuera del mismo web. Cuando se hacen cosas de este tipo hay que tener en cuenta que puede que algunas de las url que teníamos activas hasta este momento, dejen de funcionar, ya que seguramente habrán cambiado. A primera vista puede no parecer algo muy importante, puesto que seguramente nos habremos esforzado en hacer que todas las páginas sean perfectamente accesibles desde la portada, sin embargo muchas veces olvidamos que cada vez más gente entra por sitios diferentes a la portada en los webs, por ejemplo todos los usuarios que llegan referidos por indexadores como Google.

Por lo tanto, es importante que, cuando se planee cualquier tipo de actualización en un web, que afecte a las url existentes, pensemos y planifiquemos bien la forma en la que las visitas referidas a esas url han de ser redirigidas. En la situación óptima, todas estas visitas a url’s ya no existentes, habría que redirigirlas a las nuevas url’s que representen los contenidos anteriores, y en aquellos casos en los que estos ya no existan, decidir si se redirije a la portada, a una portada de la sección, o incluso a una página de error. De esta forma no estaremos desaprovechando toda la información de la que disponen los indexadores sobre nuestro web, algo que suele costar mucho tiempo y trabajo conseguir.

Para facilitar este tipo de cambios el estándar HTTP/1.1 dispone de un mecanismo ya definido, mediante el cual se puede indicar que una página ha cambiado de url. La mayoría de indexadores como Google, hacen caso de esta opción, de forma que se nos garantiza que utilizándola, las páginas que tengamos indexadas seguirán estándolo y sus url’s serán actualizadas automáticamente.

El método para conseguirlo es muy sencillo, y se basa en la utilización del código de redirección 301. Veamos a continuación algunos ejemplos de uso basándonos en el servidor web Apache.

Hay diferentes sitios en los que se pueden indicar estas redirecciones, en el archivo httpd.conf a nivel de todo el servidor web, dentro de un Virtual Host o lo que es más sencillo de gestionar y modificar, dentro de un archivo .htaccess en la raíz del document_root del dominio.

Un ejemplo sencillo de redirección sería el siguiente, en el que vamos a hacer que todas las peticiones a la página /acercade.html se redirijan a /about.html. Para ello crearíamos un archivo .htaccess en la carpeta de nuestro web (www.example.com) con el siguiente contenido:

Redirect 301 /acercade.html http://www.example.com/about.html

Con esta línea indicamos que queremos realizar una redirección 301 (permanente) que conduzca de la página /acercade.html a la página http://www.example.com/about.html. Es necesario indicar el dominio en la url destinataria, que en nuestro caso es el mismo, pero podría ser otro, lo cual nos permitiría redirigir páginas entre webs, o en aquellos casos en los que haya cambiado el nombre del dominio.

Normalmente tendremos un conjunto extenso de direcciones a redireccionar, para lo cual tendríamos que escribir una línea para cada una, sin embargo, es habitual que la mayoría de estas redirecciones cumplan determinados patrones, por lo que existe una directiva de apache de nombre RedirectMatch, que nos permite ahorrarnos la escritura de muchas de ellas. Por ejemplo, si tuviesemos que cambiar las url’s de todas las páginas que están dentro de la sección /productos por /catalogo/productos, se podría utilizar lo siguiente:

RedirectMatch 301 ^\/productos(\/.*)?$ http://www.example.com/catalogo/productos$1

En el caso anterior hemos utilizado una expresión regular para hacer que todas las solicitudes de página que empiecen por /productos se redirijan a la nueva ubicación.

Existe también otro método para efectuar las redirecciones, que se basa en la utilización de las funcionalidades que ofrece el módulo mod_rewrite de apache. Este módulo nos permite encadenar un conjunto de reglas de reescritura sobre las url e indicar acciones sobre ellas. El ejemplo anterior podríamos haberlo realizado también con las siguientes instrucciones:

RewriteEngine ON
RewriteRule ^\/productos(\/.*)?$ http://www.example.com/catalogo/productos/$1 [R=301,L]

En este caso la primera instrucción activa el motor de reescritura, y la seguna corresponde a la primera y única regla de nuestra cadena de reglas, que lo que hace es reescribir la url en base a la misma expresión regular que hemos utilizado en el ejemplo anterior. Los datos del final de la regla, [R=301,L], indican que con la nueva url obtenida hay que realizar una redirección 301 y que no hay que seguir procesando el resto de reglas.

Conclusión

Hemos visto 3 métodos diferentes de redirigir las url hacia sus nuevas ubicaciones mediante apache, cuál utilizar dependerá de cada caso, en función del número de páginas a redirigir y la complejidad que tengan las redirecciones.

Más información

Twitter Digg Delicious Stumbleupon Technorati Facebook Email

20 Respuestas para “Redirección permanente de páginas”

  1. Muchas gracias, me ha sido muy útil, claro y perfectamente explicado.

    Enhorabuena!

  2. como se hace cuando son varias paginas? Se hace un mismo archivo con diferentes lineas?

  3. Puedes introducir todas las páginas en la configuración de apache o en un archivo .htaccess, también puedes utilizar expresiones regulares si no quieres escribirlas todas y hay algún patrón que se les pueda asignar.

  4. Me presento, mi nombre es sebastián y les comento mi caso. Hace más o menos 10 días coloqué un link de una página que estoy construyendo en mi blog, con los días google empezó a enviarme visitas (poco y nada) paro mi sitio nuevo. Este sitio no está indexado en ningún buscador pero al ejecutar el comando
    site:mi-nuevo-sitio.com aparecen las 35 páginas del sitio linkeado en mi blog.
    Hace unos dias decidí cambiarle el nombre de dominio al sitio,
    y para que los buscadores no interpreten el duplicado de contenido decidí redireccionar esas 35 páginas hacia el nuevo dominio.
    Tengo el siguiente código en el .htaccess:

    —————————-
    # mod_rewrite in use

    Options +FollowSymLinks
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^viejo-sitio.com [NC]
    RewriteRule ^(.*)$ http://www.nuevo-sitio.com/1 [L,R=301]
    —————————-

    Mi pregunta es como me doy cuenta cuando ha se ha redireccionado las páginas viejas hacia las nuevas.
    Es correcto el código que tengo en .htaccess
    O sea… lo que tengo que redireccionar es un sitio completo hacia el nuevo dominio.-

  5. Hola Zafanor, entiendo que lo que has hecho ha sido poner el .htaccess en el raíz del servidor web con el dominio antiguo. Creo por tanto que la línea RewriteCond no sería necesaria.

    En cuanto a la línea RewriteRule parece correcta, haces que todas las peticiones de página se pasen el dominio nuevo-sitio. Antes del 1 va un signo de $, pero supongo que se lo habrá comido el wordpress al escribir el comentario.

    Si quieres probarlo por si hay que ajustar algo te recomiendo que hagas un telnet al puerto 80 del servidor antiguo y hagas alguna petición de página, para comprobar que te devuelve el código de redirección.

  6. Bueno Patxi, el signo $ me lo comí, y estoy probando con este código…

    ——————-

    # mod_rewrite in use

    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^sitio-viejo.com [NC]
    RewriteRule ^(.*)$ http://www.sitio-nuevo.com/$1 [L,R=301]

    ——————–

    Con este código escribo la dirección vieja en la barra del navegador y direcciona al sitio viejo.
    Lo mismo pasa cuando escribo el nuevo sitio.
    Para que se entienda bien la situación hay 2 sitios (viejo y nuevo) con el mismo contenido pero distinto dominio. Lo que cambia es el logo.

  7. Si eso lo pones en el .htaccess del dominio viejo debería funcionarte, yo de todas formas quitaría la línea RewriteCond. En el dominio nuevo no tienes que poner nada.

  8. Patxi, hice los que me decías de quitar la línea RewriteCond.
    Perdón si soy un poco tosco con este tema. Pero si escribo en el navegador sitio-viejo y sitio-nuevo ambos se manejan en forma independiente, mismo contenido pero diferente dominio. Ahora el .htaccess lo pongo en las raíz del único lugar que tengo que es http://www.sitio-viejo.com.ar con el código…
    —-

    # mod_rewrite in use

    RewriteEngine on
    RewriteRule ^(.*)$ http://www.grufoos.com/$1 [L,R=301]

    —-

    ¿Cómo es eso de hacer TELNET?

  9. Ok, según entiendo no es que tengas dos dominios alojados en diferentes sitios, sino que ambos dominios apuntan al mismo hosting, por lo que utilizabas el RewriteCond para responder con un 301 únicamente cuando se solicitase una url para el dominio viejo, cambiándola por el nuevo. Si es así, entonces sí que te hacía falta el RewriteCond.

    Prueba con esto, lo que hace es cambiar el dominio siempre que no se pida el nuevo.

    Options +FollowSymLinks
    RewriteEngine On
    RewriteBase /
    RewriteCond %{HTTP_HOST} !^www\.sitio-nuevo\.com$ [NC]
    RewriteRule ^(.*)$ http://www.sitio-nuevo.com/$1 [R=301,L]

  10. La redirección 301 a funcionado muy bien, cuando escribo en el navegador el sitio viejo me direcciona al sitio nuevo. Ahora cuando pongo en Google las palabras
    “$35.000 – Vendo Peugeot 306 xRDT Mod 98’ Full (Mar del Plata)”

    en los 2 primeros puestos me aparece el sitio viejo y en el 3º puesto el sitio nuevo. ¿Puede ser esto considerado contenido duplicado?

    Desde ya te agradezco un montón por la respuestas y la paciencia !!.

  11. eso se debe a que google todavía tiene indexadas páginas del web antiguo, conforme vaya revisándolas actualizará las url, pero lleva su tiempo…

  12. Ok…Muchas gracias por todo
    Zafanor

  13. Hola, me gustaría saber si me podríais ayudar. Tengo un sitio hecho en Joomla y conseguí, mediante CPanel, hacer que mi index, cuando fuese tecleada sin las www, se redireccionase a la index con las http://www. Sin embargo, esa redirección no opera para las páginas interiores de la web. ¿Cómo podría modificar mi .htaccess para que todas las páginas de la web, cuando se tecleasen sin las www fuesen a la versión con la www?

    Gracias!

  14. Hola a todos,
    Me gustaria poder redirigir en forma permanente (301) mediante .htacess usando algun patron para extraer un directorio en el medio de todas las urls de mi sitio:

    EJM:
    http://www.misitio.com/dir1/dir2/dir3/paginas

    a

    http://www.misitio.com/dir1/dir3/paginas

    ¿Alguna sugerencia?
    Saludos

  15. Hola Emilio, podría probar con:

    RedirectMatch 301 ^/dir1/dir2/dir3(/.*)?$ http://www.example.com/dir1/dir3$1

    Si dir1 y dir3 no son siempre iguales podrías crear un redirect para cada combinación o utilizar expresiones regulares.

  16. Gracias Patxi !!

    Funciona muy bien aparentemente. Ahora espero que google interpetre correctamente el 301 y reemplace las urls en su índice.

    Saludos.

  17. Fenomenal, esto me ha resuelto un gran problema que me ocasionaron los del alojamiento de mi web, tenia una semana con el host abajo y luego de eso me dicen que no pueden recuperar la data, tenia una base de datos de un blog con casi 100 post y me dicen eso, por lo menos ahora redirijo ese trafico a otro sitio que tuve que crear nuevo,

  18. Muchas gracias por el tuto.
    La explicación está OK.

    Yo Redireccioné un dominio completo y el pagerank y el nº de páginas indexadas por google es el que tenía en el dominio antiguo.

    Saludos.

  19. Por fín he encontrado como redireccionar una sección completa, mil millones de gracias.

    Mi htacess te lo agradece ;-), hay 60 redirecciones menos, jeje.

Trackbacks/Pingbacks

  1. David Rodríguez » Blog Archive » Redirección Permanente 301 en páginas HTML - 01. Nov, 2007

    […] Me acabo de encontrar con un caso personal en el que tenía que cambiar permanentemente alguna página en .html a una nueva dirección, y al buscar la mejor solución veo que hay cierta incertidumbre en el tema. Trás leer detenídamente algunos artículos sobre las mejores formas de hacer las redirecciones (xeoweb, eslomas, emezeta), llego a la conclusión sin lugar a dudas que la más conveniente es la redirección 301. […]