Création de sous-domaines à la volée

Bonjour,

Je réalise actuellement une application Web qui nécessite une séparation
net de chaque client (entités).

Nous souhaitons proposer une inscription automatisée au système et créer
automatiquement, lors de l’inscription, un sous-domaine par client.

C’est la technique utilisée chez BaseCamp par exemple.

Les clients accèdent ensuite à leur application via une adresse du style
http://client.mondomaine.com

Je cherche donc comment mettre en place cette technique, comment crée le
sous-domaine automatiquement ?

Comment faire pour qu’ils soit directement accessible au client ?

Comment faire pour récupérer des infos de base sur le client avec
uniquement l’URL de manière à l’identifier avec certitude (nom du client
stockée en DB de manière unique ?)?

Merci à tous pour vos réponses.

Ruggiero Vincenzo

PS : Nous travaillons avec un serveur dédié sous Debian.

Bonjour Vincenzo,

d’une part, tu dois configurer ton serveur Web pour récupérer tous les
*.mondomaine.com et les servir avec une application Rails unique.
Pour ce faire, regarde la configuration des VirtualHost d’Apache ou
autre suivant le serveur Web que tu utilises.

D’autre part, il faut que tu mettes un filtre dans ton
ApplicationController, pour récupérer l’information “client” et la
mette à disposition de tes contrôleurs.

En supposant que tu aies un modèle Account et un attribut subdomain :

before_filter { |c| c.account =
Account.find_by_subdomain(c.request.subdomains.first)
}

source :
http://redhanded.hobix.com/bits/dynamicVhostsOneLinerForRails.html


Guillaume “Zifro” DESRAT
Secrétaire de l’association Ruby France
http://www.rubyfrance.org/

re Vincenzo,

Pour continuer sur ce que disait Guillaume avec raison, tu voudrais
très certainement utiliser le plugin AccountLocation (http://
dev.rubyonrails.org/browser/plugins/account_location) pour gérer
notamment les urls (par ce qu’il faut non seulement récupérer le sous-
domaine des urls mais aussi générer des url avec le bon sous-domaine
parfois…)

np

Le 10 févr. 07 à 10:26, Guillaume Zifro DESRAT a écrit :

Alexis B. wrote:

Houla non pas besoin de plugin c’est super simple !

J’ai d�j� eu ce besoin. Je vais t’expliquer comment proc�der.

Ma table clients contient un champs host qui correspond au sous domaine.

Dans mon controller de base j’ai une fonction qui se charge de cette
op�ration. Naturellement elle est appel�e � chaque requ�te (ac un
filtre comme le dit Guillaume). Voici � quoi elle correspond sans la
gestion des exceptions (elle fait 5 lignes en vrai et g�re une chose
en plus).

Je r�cup�re le nom du serveur indiqu� dans la requ�te

host = request.env[‘HTTP_HOST’]

Puis une regex afin d’extraire le sous dommaine

host =~ /^([\w_-]+)./

Et l� y a rien de plus facile :slight_smile:

client = Client.find_by_host(host)

Pas besoin d’�crire le sous domaine dans une URL qd on peut en �crire
des realatives. Par exp�riences �crire les URL compl�te apporte tjrs
des ennuis.

Par contre pour g�rer les dns je n’ai pas cr�� de sous domaine pour
chaque client. J’en ai juste d�fini un seul avec le caract�re joker *.
Pq faire compliqu� qd on peut faire simple? :slight_smile:

Et comme le dit Guillaume il faut bien configurer sont vhost �galement.

Le 10/02/07, Nicolas P.[email protected] a �crit :

C’est effectivement la méthode la plus simple et c’est celle vers
laquelle je vais me diriger.

Une petite chose, il semble possible de récupérer le sous-domaine comme
ceci :

@subdomain = request.subdomains.first

Merci pour vos réponses

Oui j’ai remarqué ça avec le code de Guillaume. Mais j’ai préféré
laisser comme c’était étant donné que je n’avais pas testé.

Le 11/02/07, Vincenzo Ruggiero[email protected] a écrit :

Houla non pas besoin de plugin c’est super simple !

J’ai déjà eu ce besoin. Je vais t’expliquer comment procéder.

Ma table clients contient un champs host qui correspond au sous domaine.

Dans mon controller de base j’ai une fonction qui se charge de cette
opération. Naturellement elle est appelée à chaque requête (ac un
filtre comme le dit Guillaume). Voici à quoi elle correspond sans la
gestion des exceptions (elle fait 5 lignes en vrai et gère une chose
en plus).

Je récupère le nom du serveur indiqué dans la requête

host = request.env[‘HTTP_HOST’]

Puis une regex afin d’extraire le sous dommaine

host =~ /^([\w_-]+)./

Et là y a rien de plus facile :slight_smile:

client = Client.find_by_host(host)

Pas besoin d’écrire le sous domaine dans une URL qd on peut en écrire
des realatives. Par expériences écrire les URL complète apporte tjrs
des ennuis.

Par contre pour gérer les dns je n’ai pas créé de sous domaine pour
chaque client. J’en ai juste défini un seul avec le caractère joker *.
Pq faire compliqué qd on peut faire simple? :slight_smile:

Et comme le dit Guillaume il faut bien configurer sont vhost également.

Le 10/02/07, Nicolas P.[email protected] a écrit :