Al mover archivos o cambiar la estructura de directorios de tu blog es frecuente encontrarte con que hay muchos usuarios que quieren acceder a direcciones que ya no existen. La mejor solución para este problema es redirigir a los usuarios a las nuevas direcciones de forma automática. Además, tenés que informar a los buscadores del cambio.
¿Cómo se hace esto? Básicamente metiendo mano en el archivo .htaccess que tiene tu servidor Apache (si tu blog está alojado con otro server, no vale la pena que sigas leyendo este post). Vamos a poner el ejemplo de este blog porque creo que es bastante claro.
Al crear el sitio tuve la «brillante» idea de alojar el blog en un directorio llamado blog. Mi primera ingenuidad fue instalar WordPress sin mayores complicaciones y luego simplemente hacer una redirección por PHP desde la página principal de mi sitio al directorio blog. Primer error: A los buscadores no le gustan redirecciones de páginas que te envíana otras páginas. Lo mejor es trabajar a un nivel más bajo y hacer que el servidor sea el que derive la petición de un lado hacia otro.
La instrucción para hacerlo es bastante sencilla. Descargamos el archivo .htaccess, lo abrimos con cualquier editor de texto (yo uso Notepad++) y luego escribimos:
Redirect 301 /index.php http://thuer.com.ar/blog/
El 301 es un código que se utiliza para indicarle a los buscadores que esta redirección es permanente, con lo cual deben indexar la nueva dirección que le facilitamos.
Ahora supongamos que cambio de dominio y en lugar de www.thuer.com.ar me voy a www.sebathuer.com.ar. La redirección quedaría
RedirectMatch 301 (.*) http://www.sebathuer.com.ar
Obviamente, esto supone que todavía tengo subo el archivo a mi dominio anterior y redirijo al nuevo. Si cambiás de dominio en Google recomiendan tener un controlados los dos por al menos 180 días.
Estos ejemplos son sencillos y se pueden encontrar muchos del estilo en Web Deleving Training, Webconfs o Isitebuild. Sin embargo, para este blog tuve que buscar soluciones un poco más complejas.
Mi problema es el siguiente: El log del servidor me mostrar que había muchos errores de personas que querían acceder a una dirección de este estilo:
www.thuer.com.ar/2005/el-post
Cuando la URL correcta debería ser:
www.thuer.com.ar/blog/2005/el-post
La solución chapuzera sería escribir una 120 líneas y redirigir las direcciones una a una, cosa que totalmente desaconsejada porque el .htaccess se procesa cada vez que hay una petición al servidor con lo cual el tiempo de acceso a cualquier página aumenta. Sin embargo, el módulo de reescritura (mod_rewrite) de Apache admite el uso de expresiones regulares. Esto es un poco complicado para los que no somos programadores natos, pero con práctica y usando la lógico se pueden hacer maravillas.
La idea es que podemos buscar una cadena de caracteres y a partir de ahí hacer la redirección. Por ejemplo podría hacer que todas las peticiones que comienzan con /2005 se fuesen hacia /blog/2005. De esta forma todos los años tendría que agregar una nueva línea. La solución está en optimizar más.
- Si un usuario (o un motor de búsqueda, lo mismo da) me pide /200x lo llevo a blog/200x.
Planteado así parece sencillo. Sin embargo, tuve que probar bastante hasta que al fin encontré escribir un código que funcione. Me quedó así:
RedirectMatch 301 ^/200([0-9])/([^01])(.*)$ http://thuer.com.ar/blog/200$1/$2$3
Funciona hasta 2009 (no pienso hacer más cambios de este tipo, así que me vale) y tiene la ventaja de que si en algún momento tengo una dirección con un punto (que se trata de un caracter especial, porque en teoría indicaría la extensión del archivo) no da problemas.
No sé si será elegante pero funciona. Y como no soy programador, ni adminsitrador de sistemas me doy por satisfecho. Encontré muchos ejemplos avanzados de redirecciones en Askapache.com y un buen tutorial de expresiones regulares en Regular-expressions.info (ambos en inglés).
Actualización 22-02-2017: Guía completa para manejar .htaccess aquí.