En servidores apache, un fichero llamado “.htacess” le indica al demonio httpd las directivas que tiene que seguir en el directorio donde se encuentra el fichero. En este artículo voy a hablar muy por encima de una de las aplicaciones más prácticas del fichero .htaccess, las redirecciones 301 o redirecciones permanentes.


La redirección 301 más básica constaría de la siguiente sentencia:

redirect 301 /url-antigua/ http://www.nuevodominio.com/url-nueva/

La URL antigua se indica de forma relativa al archivo .htaccess (o al httpd.conf) y la nueva evidentemente se indica de forma absoluta empezando por con http://.


También tenemos la posibilidad de redireccionar en masa utilizando patrones y condiciones. Por ejemplo, podemos redirigir cualquier URL de un dominio a otro:

redirectMatch 301 ^(.*)$ http://www.javierlorente.es/

Eso redireccionaría cualquier URL como http://dominioantiguo.com/cualquier-cosa/ a la URL http://www.javierlorente.es/. En este caso, se concatenaría el /cualquier-cosa/.

Sin embargo, hay veces que no queremos concatenar nada. Imaginémonos que queremos redireccionar por ejmplo un conjunto de noticiasde 50.000 noticias, redirigimos unas 500 una a una, y el resto de noticias, las redirigimos a la sección padre, por la razón que sea, no viene al caso. Entonces tendríamos:

Redirect permanent /noticias/seccion/nombre-noticia-id.html dominio.com/seccion/subseccion/id.html
Redirect permanent /noticias/otra-seccion/keywords-noticia-id.html dominio.com/seccion/subseccion/id.html
RedirectMatch permanent /noticias/seccion/(.*)$ dominio.com/seccion/


También podemos redirigir una URL de un dominio a la misma URL en otro dominio:

redirectMatch 301 ^(.*)$ http://www.javierlorente.es/$1

Eso redireccionaría cualquier URL como http://dominioantiguo.com/cualquier-cosa/ a la URL http://www.javierlorente.es/cualquier-cosa/.


Si queremos optimizar un poco la carga de nuestro servidor y tenemos acceso al fichero httpd.conf (en VPS o servidores dedicados, por ejemplo), mi consejo es que le enchufemos estas directivas directamente al fichero httpd.conf y que le indiquemos que no busque los ficheros .htaccess recursivamente en cada directorio que lea, ahorraremos algunas milésimas de segundo.

Por último, lo anteriormente expuesto son las formas de redirecciones más básicas pero lo cierto es que el mod rewrite de Apache soporta reglas o condiciones por lo que podemos crear redirecciones dinámicas a traves de URLs iniciales. Tenéis más información sobre redirecciones complejas en estas dos urls:

Espero que os haya servido de ayuda 😉

Actualización: Gracias a Ani López he encontrado esta fantástica guía de introducción al URL Rewriting

Actualización 2: Para redirigir un dominio sin www a con www ponemos el siguiente código en el htaccess.

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

Para hacer lo contrario, para eliminar las www:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^my-domain.com$ [NC]
RewriteRule ^(.*)$ http://my-domain.com/$1 [R=301,L]

Actualización 3: Tip WPO

Cuando tenemos que redirigir muchas URLs, es preferible hacerlas por código en vez de incrustarlas a fuego en el fichero de configuración del servidor. Esto es así porque las redirecciones que se carguen en el fichero a fuego ocuparán memoria y harán que el resto de peticiones, las normales que ataquen URLs 200, se resientan. Un truco muy usado es paquetizar las redirecciones y servirlas por código, en ficheros de programación de servidor, php, perl, etc. De esta forma las líneas que se necesitan poner a fuego se reducen drásticamente y únicamente leeremos el hipotética fichero redirecciones.php en caso de que realmente se esté atacando una URL que el propio motor en producción no entienda. Incluso hay gente que va más allá, cargando las redirecciones en el propio error 404, para optimizar al máximo el tiempo de respuesta en peticiones válidas.