Mejora SEO: agrupa contenido con un Proxy Inverso

En proyectos con muchos años a sus espaldas es muy probable que tengamos una amalgama de recursos repartidos en diferentes dominios.

Por ejemplo podemos tener la web corporativa bajo la dirección https://www.dominio.com, a su vez el blog dentro de http://wordpress.dominio.com y algunas landings dentro del servidor de nuestra empresa de publicidad en urls del tipo http://landings.publicidad-empresa.es/theme.php?id=333l19393 o bien http://mi-dominio.otraempresa.es/landing-de-producto.aspx

Esta dispersión puede deberse a múltiples causas, por ejemplo, tener la web principal en un servidor Linux y las landings en un servidor Windows. Tener un blog con gran cantidad de tráfico que consume mucha cpu y ancho de banda y queremos separar ese consumo de la web principal, etc.

El mayor problema de esta estrategia asoma en relación al SEO. Tenemos que concentrar la autoridad en el dominio principal. Esto significa que la mejor alternativa es que todo cuelgue del dominio principal. Así no diluimos la fuerza dentro de todos los subdominios.

Lo que debemos hacer es transformar estos subdominios y dominios externos en carpetas del dominio principal.
Para hacerlo podemos hacerlo de forma clásica, agrupando físicamente todos los recursos repartidos, dentro del servidor que aloja el contenido principal. La problemática de esta opción es que a veces no es posible, por ejemplo incorporar contenido de un servidor Windows bajo un Linux, o bien conlleva un gran coste debido a la reconfiguración del contenido: instalación de bases de datos, ajuste de rutas, etc.

En cambio, existe otra solución, mucho más sencilla y completamente transparente para el usuario final que visita nuestra web. Dicha solución se llama Proxy Inverso.

¿Qué es un proxy inverso?

La misión más común, y la que nos interesa en nuestro caso, de un Proxy Inverso consiste en traducir peticiones sobre carpetas fictícias, realizadas al servidor principal, a su equivalente dentro de nuestra infraestructura, ya sea un subdominio o un dominio externo.

Por ejemplo, para el caso de un blog, al visitar la dirección https://www.midominio.com/blog/, nuestro visitante verá el contenido que realmente esta bajo http://blog.midominio.com

Todos los enlaces de blog.midominio.com al mostrarse bajo la carpeta /blog del dominio principal se habrán modificado para que sigan la estructura de urls del servidor principal. El usuario que está navegando por la web nunca sabrá de la existencia del subdominio.

No solamente eso sino que, en este ejemplo, estaremos viendo contenido no seguro (http) bajo una conexión segura (https) sin necesidad de instalar ningún otro certificado de seguridad en el subdominio.

¿Cómo podemos instalar un Proxy Inverso en nuestro dominio principal?

Básicamente se trata de realizar una serie de modificaciones al servidor web del dominio que utilizaremos como principal. Los servidores web más comunes son Apache y Nginx en sistemas Linux y Internet Information Server (IIS) en Windows. Todos ellos admiten configuraciones que permitan ejecutar un Proxy Inverso.

Haremos un ejemplo en Apache para el caso del blog que comentábamos anteriormente.
En este caso como requisitos previos tendremos que tener instalados los módulos siguientes en el servidor web.

  • a2enmod proxy
  • a2enmod proxy_balancer
  • a2enmod proxy_http
  • a2enmod substitute
  • a2enmod ssl

Una vez instalados estos módulos de Apache tendriamos que modificar el VirtualHost de nuestro dominio.

<VirtualHost *:443>
 ServerName midominio.com
 ServerAlias www.midominio.com
 ...
 ...
 (configuración)
 ...
 ...
</VirtualHost>

Y donde pone (configuración) escribíriamos lo siguiente.

#
# Nos interesa que el servidor web que gestiona el subdominio reciba la cabecera Host: blog.midominio.com como si realmente estubieramos accediendo como un navegador web.
# El comportamiento por defecto seria hacerle la petición como si fuera Host: www.midominio.com y esto nos daria un 404 en el mejor de los casos.
#
ProxyPreserveHost Off
#
ProxyRequests Off
# Si el subdominio estubiera bajo https (eg: https://blog.midominio.com) necesitariamos las cinco líneas de a continuación. Quitaríamos el simbolo # de delante.
#
# SSLProxyEngine on
# SSLProxyVerify none
# SSLProxyCheckPeerCN off
# SSLProxyCheckPeerName off
# SSLProxyCheckPeerExpire off
# Aquí es donde indicamos que toda petición a https://www.midominio.com/blog/ se ha de gestionar via Proxy Inverso.
<Location /blog>
# Ante todo, desde el servidor principal haremos la petición al servidor del subdominio pidiéndole que no nos devuelva el html comprimido. Es necesario para que el módulo substitute pueda hacer el cambio de urls antes de mostrarselo al cliente.
RequestHeader unset Accept-Encoding
#
# Si subdominio esta bajo http (sin ssl)
ProxyPass http://blog.midominio.com/
ProxyPassReverse http:///blog.midominio.com/
# Si el subdominio estuviera bajo contenido seguro simplemente lo solicitariamos via https.
#
# ProxyPass https://blog.midominio.com/
# ProxyPassReverse https://blog.midominio.com/
#
#
# Y finalmente es donde hacemos las sustituciones de texto necesarias para que el contenido parezca existir físicamente dentro de la carpeta /blog/
#
# Buscamos en el código las posibles versiones que tengan la dirección "antigua" y las reemplazamos por la url correcta.
#
#
Substitute "s|blog.midominio.com/|www.midominio.com/|ni"
Substitute "s|blog.midominio.com|www.midominio.com|ni"
# Añadimos el filtro substitute dentro de la cadena de filtros de Apache para que ejecute dichas sustituciones.
FilterDeclare Substitute
FilterProvider Substitute SUBSTITUTE "%{REQUEST_URI} =~ m#^/#"
FilterChain +Substitute
Order allow,deny
Allow from all

</Location>

Una vez añadido este bloque de configuración solamente nos quedaría reiniciar el servidor Apache y comenzar las pruebas.

Para poner la guinda del pastel, la única configuración que deberíamos poner en el servidor del subdominio sería la siguiente. Toda petición a su contenido que no provenga del servidor principal debería hacer una redirección 301 sobre la dirección correcta.

Si un usuario nos solicitase por ejemplo, via su navegador, el contenido de http://blog.midominio.com/articulo-muy-interesante-del-producto/ el servidor deberia responder con un 301 sobre la dirección https://www.midominio.com/blog/articulo-muy-interesante-del-producto/
Esta redirección no es baladí, lo que queremos evitar es penalizaciones debidas a contenido duplicado.

Con todo lo dicho hasta ahora al final conseguiremos tener todo nuestro contenido reunido bajo el mismo paraguas del dominio principal.