Cuando una página de nuestro sitio web es movida de directorio, renombrada o simplemente eliminada se hace imprescindible realizar alguna acción para que por un lado los buscadores sepan que esa url que tienen indexada ha cambiado o desaparecido y que por otro lado los usuarios cuando nos visiten tengan contenido disponible y no un error 404 de página no encontrada.

En estos días he tenido que arreglar cositas en alguno de mis sitios web y te voy a contar cómo lo he solucionado, tal vez de esa forma con mi ejemplo,  puedas solucionar tu problema. 🙂

Lo primero que debemos hacer es activar el mod_rewrite de Apache con esta primera instrucción:

RewriteEngine on

Redireccionar un subdominio a dominio principal

El primer caso que se me planteó fue eliminar un subdominio y redireccionar  esa url sin contenido  al dominio principal.

En algunos servidores con la opción RewriteRule es preciso poner antes Options +FollowSymlinks  que sirve para habilitar la entrada de enlaces simbólicos. En algunos casos si no está habilitado devuelve un error de servidor 500. En mi caso no ha sido preciso poner esa instrucción, pero si tienes que ponerla, se hace así:

Options +FollowSymlinks

RewriteCond %{HTTP_HOST} ^subdir\.dominio\.com$ [OR]

RewriteCond %{HTTP_HOST} ^www\.subdir\.dominio\.com$

RewriteRule ^/?$ “http\:\/\/www\.dominio\.com” [R=301,L]

Con este grupo de instrucciones le digo que el subdominio subdir.dominio.com  tanto con  las 3w como sin ellas, redireccione a  http://www.dominio.com  de manera permanente.

Esto lo he colocado en un archivo .htaccess dentro del mismo subdominio.

Eliminar un subdirectorio y redireccionar la url a otra página

Decidí eliminar un servicio de topsites que tenía  y en este caso la instrucción que puse en el .htaccess del root fue esta:

RedirectMatch 301 ^/nombrecarpeta/(.*)$   http://www.dominio.com

Con esto le digo que el subdirectorio nombredecarpeta y todo lo que contiene redireccione a la url principal de mi dominio.

Eliminar contenido duplicado index.html, index.php

Otro problema que tenía era que el dominio principal aparecía como dominio.com y dominio.com/index.html o dominio.com/index.php según la extensión de url que usase para hacer el index. Pues bien, esto lo he arreglado de esta manera:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^/]+/)*index\.html\ HTTP/

RewriteRule ^(([^/]+/)*)index\.html$ http://www.midominio.com/$1 [R=301,L]

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^/]+/)*index\.php\ HTTP/

RewriteRule ^(([^/]+/)*)index\.php$ http://www.midominio.com/$1 [R=301,L]

Canonicalización de la url

Otro problema que me tocó solucionar fue el que la url se mostrase con las www aunque el usuario teclease el dominio sin las www.  Esto lo solucioné con este grupo de instrucciones:

RewriteCond %{HTTP_HOST} ^midominio\.com[NC]

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

Renombrar un directorio

Fue muy sencillo, y el mismo ejemplo me sirve para renombrar una página también. ¡Imaginación al poder!

Redirect 301 /directorioviejo/ http://www.midominio.com/nuevodirectorio/

 Las banderas

Si os fijáis al lado de [R=301,L] en todas las instrucciones previas que os he mencionado hay una L, esto es una bandera que sirve para indicar un tipo de acción. Si hay varias banderas se separan por comas y siempre van entre corchetes tal como se muestra en el ejemplo.

Algunas banderas con sus correspondientes significados son:

  • R: (redirect) para forzar una redirección HTTP
  • F: (forbidden) para prohibir el acceso
  • G: (gone) para eliminar la URL
  • P: (proxy) para pasar la URL a mod_proxy.
  • L: (last) para detener el procesamiento.
  • N: (next) para continuar
  • C: (chain) para encadenar la regla activa con la siguiente
  • F: (type) para obligar un determinado tipo MIME.
  • NS: (nosubreq) para segurarse que la regla sólo se aplica si no se realizan subpeticiones internas.
  • NC: (nocase) para que la URL no distinga mayúsculas de minúsculas.
  • QSA: (qsappend) para añadir una nueva cadena de consulta (query string) en lugar de sustituirla.
  • PT: (passthrough) para asar la URL modificada a otro módulo apache.
  • S: (skip) para saltar la siguiente regla.
  • E: (env) para asignar una variable de entorno.

Web accesible por IP

Soy la “tia problemas” :), es verdad, pero lo bueno que tengo es que yo veo la oportunidad de aprender y solucionar en vez de la de tropezar y por tanto la de crecer. Creo que en cuestión de redireccionamiento me tropecé con todos o casi todos los casos disponibles, ¡qué locura! O al menos a mi me pareció una locura mientras los iba solucionando :).

Bien, en mi web para niños tenía un problema de contenido duplicado porque la web era accesible tanto por tu IP como por su nombre de dominio. Si ese es tu problema, tiene fácil solución, yo lo arreglé así:

RewriteCond %{HTTP_HOST} ^00\.00\.000\.000  <– Obvio aquí pones tu número de IP

RewriteRule (.*) http://www.midominio.com/$1 [R=301,L]

Redireccionar urls dinámicas

Hace tiempo, mucho tiempo, tenía un foro instalado en uno de mis dominios y lo eliminé. Pensaba que todas las urls estarían ya eliminadas de Google pero cual ha sido mi sorpresa que al recibir seoparanewbies.com un enlace desde mi otra web anunciando su creación, he visto que me aparecían enlaces con una estructura que ya no existía desde hace al menos 3 años en el hosting.

www.midominio.com/?a=lost_pw
www.midominio.com/?a=stats&u=AmorEterno
www.midominio.com/?a=stats&u=Alma www.midominio.com/?a=stats&u=AmorEterno&all_reviews=1 www.midominio.com/?a=user_cp
www.midominio.com/?action=printpage;topic=2614.0

Si os fijáis todas las urls guardan un patrón: nombre de  url/identificador=   y lo agrupé en tres grupos de instrucciones:

Caso 1

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /\?a=(.+)&u=(.+)\ HTTP/

RewriteRule ^$ http://www.midominio.com? [L,R=301]

Con este Rewrite incluyo todas las urls del dominio del tipo midominio.com/?a=grupodecaracteres&u=grupodecaracteres y además como ya no existe lo redirecciono con un 301 con las banderas R de forzar redirección y L para detener el procesamiento. Se corresponde con este patrón:www.midominio.com/?a=stats&u=AmorEterno

Caso 2

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /\?a=(.+)\ HTTP/

RewriteRule ^$ http://www.midominio.com? [L,R=301]

Con estas dos instrucciones la estructura es más simple aún pues todo lo que hay antes de \? Es lo que corresponde a la url del dominio, y a partir de \ le digo que lo que haya después de ?a= y cualquier grupo de caracteres (que corresponden sólo a ese identificador) lo redireccioné forzando la redirección a la url principal. Se corresponde con este patrón: www.midominio.com/?a=lost_pw

Caso 3

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /\?action=(.+)topic=(.+)\ HTTP/

RewriteRule ^$ http://www.midominio.com? [L,R=301]

Esta es la que más me costó solucionar porque lleva dos identificadores pero no están unidos por & pero finalmente después de conseguido lo que quería no me pareció tan complicado. En este caso tengo un identificador que es action=grupo de caracteres y otro que es topic=grupo de caracteres. Se correspondería a este caso concreto: www.midominio.com/?action=printpage;topic=2614.0

Incluso me encontré por la web una página que era un generador para convertir urls dinámicas en urls estáticas y además redireccionar las dinamicas a las estáticas para evitar contenido duplicado. No me solucionó al 100% la papeleta pero si me sirvió para entender la dinámica de este tipo de urls. Me ayudé también de la página de Apache y sus explicaciones sobre el mod rewrite.

Por el momento mis coqueteos con los redireccionamientos tienen un “standby”, pero no descarto amplicar este artículo – chuleta si me surge el tener que solucionar otro tipo de redirección que aquí no contemplo.

Espero que mis aventuras y desventuras con los redireccionamientos y el contenido duplicado te sean de utilidad. Gracias por leerme y si te apetece, ya sabes jeje ¡a compartir!.

Por otra parte si lo que necesitas es un consultor SEO te recomiendo que visites

¡Que tengas un buen día!