Une infinité de sous-domaines


22 février 2016

Afin de mettre à jour une vieille configuration de Bind+Apache que j'avais mis en place aux alentours de 2003 pour ma société Insitoo, voici comment gérer dynamiquement une infinité de sous-domaines, comme par exemple :

client1.exemple.com
gudule.exemple.com
ubu.exemple.com
etc.

Tout cela sans avoir à ajouter une ligne à la zone DNS et une configuration Apache pour chaque sous-domaine.

Commençons par le DNS du domaine principal (exemple.com ici), il faut ajouter la ligne suivante dans sa zone DNS :

*.exemple.com.  A   XX.XX.XX.XX     ;IP du serveur destination

Le caractère * a la signification intuitive qu'un programmeur/admin attend : Bind va reconnaître TOUTES les demandes DNS ayant comme suffixe "exemple.com" et renvoyer l'adresse IP du serveur située après le A. La gestion de ce caractère par les serveurs DNS a son propre RFC.

Il reste à s'occuper d'Apache, qui va recevoir des requêtes HTTP pour ces sous-domaines, dont il faut s'occuper en ajoutant les lignes qui suivent dans le virtual host qui correspond au domaine principal :

ServerName  exemple.com
ServerAlias *.exemple.com
RewriteEngine   On
RewriteCond     %{HTTP_HOST}    ^([a-zA-Z0-9_-]+)\.exemple\.com
RewriteRule     (.*)    /index.php?a=%1&b=$1    [L]

Ce qui permet de rediriger, silencieusement, la requête http://XXX.exemple.com/test vers une exécution du script http://exemple.com/index.php?a=XXX&b=test. Cela sans redirection HTTP bien sûr...

Note : le slash situé avant la référence à index.php sur la ligne de RewriteRule est très important ! Si cette configuration ne fonctionne pas, vérifiez sa présence...

Note 2 : d'après les specs, le caractère underscore ("_") est interdit dans les libellés des noeuds DNS. Or, les navigateurs usuels, Apache et même Bind gèrent ce caractère correctement. De même, un libellé de noeud DNS commençant par un chiffre est correctement géré, alors que ce cas n'est pas non plus permis par la spec. Je n'ai pas trouvé de correctif ou d'addendum expliquant cela.

Accueil