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:
- 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.
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
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.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.
@aca463 Me alegro que te haya servido.
Un saludo.
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?
Bueno http://www.vertutoriales.com/index.phpphp/tag/php/ resolvio?
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:
Creo que así debería funcionarte.
Un saludo.
Hola! Cómo podría hacer direccionamiento hacia otro equipo? Por ejemplo, los usuarios entran a mi página http://www.pagina.com, y si ellos digitan http://www.pagina.com/servicio1 se van a otro equipo. Cómo puede hacer esto?
Y para eliminar variables? Por ejemplo
http://www.dominio.com/directorio/?variables
que redirija a http://www.dominio.com/directorio/ sin variables?
Abrazos
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.
Me alegro que te haya servido 🙂
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 !
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
Hola,
Muy buena explicación, gracias por el post. Tengo una consulta, desde mi web puedo rediteccionar de http://www.example.com/ hacia http://www.example/hello, pero cuando le saco el slash http://www.example.com no redirecciona a ningun lugar, la directiva que utilizo es:
RedirectMatch ^/$ /hello
Gracias por la ayuda !!
Hola Willy,
prueba con
RedirectMatch ^/?$ /hello