Usando mod_rewrite para redireccionar subdominios

En este caso hace algún tiempo, me pidieron un .htaccess que mediante el uso de mod_rewrite permitiera que cualquier subdominio (por ejemplo: http://cualquiercosa.serhost.com) apuntase a una carpeta del dominio (ejemplo: http://serhost.com/pruebas/).

El motivo para hacer esto era que tenían un script que querían que fuese usado por todos los subdominios, imaginémonos un foro y que según el subdominio eligiese una base de datos u otra (para que fuese un foro de una u otra cosa). Las modificaciones al script de un foro (de un phpbb por ejemplo) son bastante reducidas (modificar un poco el config.php y poco más para según el subdominio hacer una u otra cosa).

De este modo la actualización del script en caso de un fallo de seguridad, sólo tendría que hacerse una vez y además no tendrías que tener múltiples copias del mismo script ocupando espacio.

A continuación el como lo hice…

Primero hay que tener en cuenta que el servidor de hosting donde tengas tu dominio debe soportar varias cosas:

1) Tener cargado el mod_rewrite.

2) Permitir el uso de ficheros .htaccess (pudiendo sobreescribir la configuración).

3) Permitir el uso de wildcard en el DNS así como tener un ScriptAlias *.tudominio.com en el virtualhost que esté tu dominio para que todas las peticiones de forma: http://(cualquiercosa).(tudominio.com) usen como documento principal el del directorio raíz de tu dominio (esto normalmente hay que solicitarlo a tu proveedor).

Bien, en caso de cumplir todo esto la tarea es simple, vamos a poner un fichero .htaccess en el raíz (tu directorio public_html, www ó html, es decir, donde tengas tu web, de modo que si pusieses http://(tudominio.com)/.htaccess pudieses acceder a él, en realidad en caso de hacerlo lo normal es que te devuelva un error 403: Prohibido, ya que apache por defecto no muestra ningún archivo que comience por .ht por motivos de seguridad).

El fichero .htaccess en cuestión debe contener algo del estilo:

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{HTTP_HOST} !^(www\.)?serhost\.com$ [NC]
RewriteCond %{HTTP_HOST} ^(www\.)?([^\.]+)\.serhost\.com$ [NC]
RewriteRule ^(.*)$ pruebas/$1 [QSA,L]

Sustituyendo serhost.com por tu dominio y pruebas por la carpeta a donde quieras realizar esta redirección transparente.

ACTUALIZACIÓN: Subdominios dinámicos II de recomendable lectura si no funciona el .htaccess aquí expuesto. En el momento de esta actualización el artículo tenía: 3854 lecturas.

Puede que te preguntes ¿por qué le llamas transparente?. Esto es porque si pones: http://elsubdominio.eldominioquetengas.com te aparecerá eso en la barra del navegador, sin embargo en teoría te mostraría http://eldominioquetengas.com pero el archivo .htaccess hace que en lugar de esto le devuelvas (en este caso) la carpeta pruebas, de modo que piense que realmente sigue en http://elsubdominio.eldominioquetengas.com. Esto no es ni un frame oculto ni una redirección ni nada por el estilo, sino que coge la web directamente de esa carpeta, como si hubieses configurado (que así es) todos los subdominios en esa carpeta.

Vale, ahora todo apunta ahí, pero, ¿como puedo saber el subdominio que el usuario ha tecleado?.

Pues con un lenguaje como PHP esto es sencillo:

<?php
//Capturar el subdominio
//Securizo un poco la cadena por si acaso
$LongitudMaxDeUsuario=100; // Por seguridad
$usuario = addslashes(htmlentities(substr(strtolower($_SERVER['SERVER_NAME']), 0, $LongitudMaxDeUsuario)));
//Capturo la parte antes del punto (también se podría hacer con una expresión regular)
$usuario=substr($usuario,0,strpos($usuario,"."));
?>

Ahora la variable $usuario contendrá el subdominio por el que se accede a la web.

Bibliografía:
http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html