Desarrollo de Software

Guía para aplicar Redirección 301 con Apache

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 paréntesis 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:

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.

16 comentarios en “Guía para aplicar Redirección 301 con Apache

  1. Tengo una duda, he insertado un código para que no apareza la extensión en mis urls, www .ejemplo.com/archivo pero el problema es que todavía puedo ingresar mediante www .ejemplo.com/archivo.php , como hacer la redirección de esto.

    Saludos y gracias

  2. Cuando entras en http://www.ejemplo.com/archivo.php, ¿no se te redirecciona a http://www.ejemplo.com/archivo? Supongo que tendrás algo parecido a RedirectMatch 301 / (.*).php http://www.ejemplo.com/$1. Esto no te impide que entres indicando la extensión php en la url, pero si se te redigirá a la dirección en la que no tiene extensión. Si no quieres que tus visitantes entren introduciendo la extensión podría modificarse para que les saliera un error 404 por ejemplo, pero seguro que estarías perdiendo visitas.

  3. 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.

  4. Hola yo quiero redireccionar mediante un redireccionamiento 301 en .htaccess un dominio a otro ya existente y que todas las urls del dominio viejo vayan a la Home del dominio nuevo.

    ¿Como puedo hacerlo?

  5. Hola,

    estaba intentado redirigir «www.midominio.es/estadisticas» a «www.midominio.es/awstats/awstats.pl» y con el Redirect en el httpd.conf funciona, pero no quería que se viera la pagina de destino y permaneza en el navegador la que el usuario teclea.

    ¿Es posible?

    Muchas gracias.

    • Hola,

      sí, es posible. Utiliza para esto la directiva RewriteRule:

      RewriteRule ^estadisticas$ awstats/awstats.pl [L]

      Creo que así debería funcionarte.

      Un saludo.

  6. No se llama «cadena GET», se llama querystring. Fuera de eso, excelente manual. Tengo 4 años que modifiqué por última vez un htaccess y la verdad ya no me acordaba de nada y vaya que me urge hacerlo.

    Gracias.

  7. Hola !, tengo dos dominios apuntando a un mismo hosting, dominio1.tv y dominio2.com, pero el dominio2.com es muy nuevo y quiero hacer un cambio de dominio aplicando redirectMatch 301, cuando agrego la instrucción en el .htaccess me da un error de «This webpage has a redirect loop», la instrucción es la siguiente:
    redirectMatch 301 ^(.*)$ http://www.dominio2.com$1

    Lo que quiero es utilizar el dominio2.com pero sin perder el posicionamiento que tiene dominio1.tv

    Agradexco tu ayuda al respecto, Saludos !

  8. me interesa pasar de dominioactual.com/categoria/aaa-bbb-ccc-ddd.php a nuevodominio.com/otracategoria/aaa-bbb-ccc-ddd.html crei leer arriba la solucion pero no se entendio

Pon un comentario

Tu dirección de email no será publicada.

Puedes usar estas etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>