web-dev-qa-db-fra.com

Comment laisser PHP créer automatiquement un sous-domaine pour chaque utilisateur?

Comment créer un sous-domaine tel que http://user.mywebsite.com ? Dois-je accéder à htaccess d'une manière ou d'une autre? Est-il réellement simplement possible de le créer avec du code php pur ou dois-je utiliser un langage de script/serveur externe?

À ceux qui ont répondu: Eh bien, devrais-je demander à mon hébergeur s'ils fournissent une sorte d'accès DNS?

155
Skuta

Vous cherchez à créer un enregistrement A personnalisé .

Je suis presque sûr que vous pouvez utiliser des caractères génériques lors de la spécification des enregistrements A, ce qui vous permettrait de faire quelque chose comme ceci:

*.mywebsite.com       IN  A       127.0.0.1

127.0.0.1 serait l'adresse IP de votre serveur Web. La méthode d’ajout de l’enregistrement dépendra de votre hôte.


Le faire comme http://mywebsite.com/user serait beaucoup plus facile à configurer si c'était une option.

Ensuite, vous pouvez simplement ajouter un fichier .htaccess qui ressemble à ceci:

Options +FollowSymLinks

RewriteEngine On
RewriteRule ^([aA-zZ])$  dostuff.php?username=$1

Dans ce qui précède, les noms d'utilisateur sont limités aux caractères a-z


La règle de réécriture pour saisir le sous-domaine ressemblerait à ceci:

RewriteCond %{HTTP_Host} ^(^.*)\.mywebsite.com
RewriteRule (.*)  dostuff.php?username=%1
131
Mark Biek

La fonctionnalité que vous recherchez est appelée Wildcard Subdomains . Cela vous permet de ne pas avoir à configurer DNS pour chaque sous-domaine, mais à utiliser plutôt les réécritures Apache pour la redirection. Vous pouvez trouver un tutoriel Nice ici , mais il existe des milliers de tutoriels. Voici le code nécessaire de ce tutoriel:

<VirtualHost 111.22.33.55>
    DocumentRoot /www/subdomain
    ServerName www.domain.tld
    ServerAlias *.domain.tld
</VirtualHost>

Cependant, étant donné que cela nécessite l'utilisation de VirtualHosts, il doit être défini dans le fichier httpd.conf du serveur, au lieu d'un fichier .htaccess local.

29
balupton

Je le fais un peu différent de Mark. Je passe le domaine entier et prends le sous-domaine en php.

RewriteCond {REQUEST_URI} !\.(png|gif|jpg)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php?uri=$1&hostName=%{HTTP_Host}

Cela ignore les images et mappe tout le reste dans mon fichier index.php. Donc si je vais à

http://fred.mywebsite.com/album/Dance/now

Je reviens

http://fred.mywebsite.com/index.php?uri=album/Dance/now&hostName=fred.mywebsite.com

Ensuite, dans mon code index.php, je viens d’éclater mon nom d’utilisateur hors du nom d’hôte. Cela me donne de jolies jolies URL de référencement.

23
gradbot

Nous avons configuré un DNS générique comme expliqué ci-dessus. Donc, le disque est * .yourname.com

Ensuite, tous les sous-domaines vont effectivement au même endroit, mais PHP traite chaque sous-domaine comme un compte différent.

Nous utilisons le code suivant:

$url=$_SERVER["REQUEST_URI"];
$account=str_replace(".yourdomain.com","",$url);

Ce code définit simplement le $account variable identique au sous-domaine. Vous pouvez ensuite récupérer leurs fichiers et autres informations en fonction de leur compte.

Ce n'est probablement pas aussi efficace que les méthodes énumérées ci-dessus, mais si vous n'avez pas accès à BIND et/ou à une extension .htaccess, cette méthode devrait fonctionner (tant que votre hôte installera le caractère générique pour vous).

Nous utilisons effectivement cette méthode pour vous connecter à la base de données des clients pour une application de commerce électronique multi-sociétés, mais cela peut également fonctionner pour vous.

14
Gordon

Ne vous mêlez pas des fichiers .htaccess lorsque vous pouvez utiliser hébergement virtuel de masse Apache .

De la documentation:

#include part of the server name in the filenames VirtualDocumentRoot /www/hosts/%2/docs

D'une certaine manière, c'est l'inverse de votre question: chaque "sous-domaine" est un utilisateur. Si l'utilisateur n'existe pas, vous obtenez un 404.

Le seul inconvénient est que la variable d'environnement DOCUMENT_ROOT n’est pas correctement défini sur le sous-répertoire utilisé , mais sur la racine par défaut de document_root dans de htconfig.

8
Willem

Simple PHP pour les applications Web multi-domaines et sous-domaines)

Étape 1. Fournissez un enregistrement DNS A sous la forme "*" pour les domaines (ou domaines) que vous allez servir "example.org"

A record => *.example.org
A record => *.example.net

Étape 2. Vérifiez le caractère unique des connexions lorsque l'utilisateur enregistre ou modifie son identifiant. En outre, évitez les points dans ces connexions.

Étape 3. Vérifiez ensuite la requête

        // Request was http://qwerty.example.org
        $q = explode('.', $_SERVER['HTTP_Host']);
        /*
            We get following array
            Array
            (
                [0] => qwerty
                [1] => example
                [2] => org
            )
        */

        // Step 4.
        // If second piece of array exists, request was for 
        // SUBDOMAIN which is stored in zero-piece $q[0]
        // otherwise it was for DOMAIN

        if(isset($q[2])) {
            // Find stuff in database for login $q[0] or here it is "qwerty"
            // Use $q[1] to check which domain is asked if u serve multiple domains
        }

?>

Cette solution peut desservir différents domaines

qwerty.example.org
qwerty.example.net 

johnsmith.somecompany.com
paulsmith.somecompany.com

Si vous avez besoin des mêmes pseudonymes sur différents domaines desservis différemment, vous devrez peut-être enregistrer le choix de l'utilisateur pour le domaine lors de l'enregistrement de la connexion.

smith.example.org // Show info about John Smith
smith.example.net // Show info about Paul Smith 
6
Alex Khimich

En plus des modifications de configuration sur votre serveur WWW pour gérer le nouveau sous-domaine, votre code doit également modifier vos enregistrements DNS. Ainsi, à moins que vous n'utilisiez votre propre BIND (ou similaire), vous devrez trouver un moyen d'accéder à la configuration de votre fournisseur de serveur de noms. S'ils n'offrent pas une sorte d'API, cela peut devenir difficile.

Mise à jour: oui, je vérifierais auprès de votre registraire s'il fournit également le service de serveur de noms (comme c'est souvent le cas). Je n'ai jamais exploré cette option auparavant mais je soupçonne que la plupart des bureaux d'enregistrement des consommateurs ne le font pas. Je suis allé chercher Google pour les API GoDaddy et DNS mais je n'ai pas pu mettre la main dessus. Je pense donc que la meilleure option serait de consulter l'aide en ligne de votre fournisseur, et si cela ne répond pas à la question, prenez garde de leur personnel de soutien.

4
theraccoonbear

Vous pouvez [potentiellement] réécrire l'URL, mais oui: vous devez avoir le contrôle de vos paramètres DNS pour que, lorsqu'un utilisateur est ajouté, il obtienne son propre sous-domaine.

4
warren

Tout d'abord, vous devez vous assurer que votre serveur est configuré pour autoriser les sous-domaines génériques. J'ai réalisé cela dans JustHost en créant un sous-domaine manuellement nommé *. J'ai également spécifié un dossier appelé subdomains comme racine du document pour les sous-domaines génériques. Ajoutez ceci à un .htaccess fichier dans votre dossier sous-domaines:

RewriteEngine On
RewriteCond %{HTTP_Host} !^www\.website\.com$
RewriteCond %{HTTP_Host} ^(\w+)\.website\.com$
RewriteCond %{REQUEST_URI}:%1 !^/([^/]+)/([^:]*):\1
RewriteRule ^(.*)$ /%1/$1 [QSA]

Enfin, il vous suffit de créer un dossier dans votre dossier de sous-domaines, puis de placer les fichiers du sous-domaine dans ce répertoire.

3
Dan Bray

Ceci peut être réalisé en .htaccess à condition que votre serveur soit configuré pour autoriser les sous-domaines génériques. J'ai réalisé cela dans JustHost en créant un sous-domaine manuellement nommé * et en spécifiant un dossier appelé sous-domaines en tant que racine du document pour les sous-domaines génériques. Ajoutez ceci à votre .htaccess fichier:

RewriteEngine On
RewriteCond %{HTTP_Host} !^www\.website\.com$
RewriteCond %{HTTP_Host} ^(\w+)\.website\.com$
RewriteCond %{REQUEST_URI}:%1 !^/([^/]+)/([^:]*):\1
RewriteRule ^(.*)$ /%1/$1 [QSA]

Enfin, créez un dossier pour votre sous-domaine et placez les fichiers de sous-domaines.

2
Dan Bray

Je voulais juste ajouter que si vous utilisez CloudFlare (gratuit), vous pouvez utiliser leur API pour gérer facilement votre DNS.

1
kiwixz