121 votes

Créer des sous-domaines à la volée avec .htaccess (PHP)

Je cherche à créer un système qui, lors de l'inscription, créera un sous-domaine sur mon site Web pour la zone du compte de l'utilisateur.

par exemple, johndoe.website.com

Je pense qu'il s'agit d'un problème lié au fichier .htaccess et à une éventuelle redirection vers un autre emplacement du site Web. Je ne sais pas vraiment. Mais toute information pour me permettre de démarrer serait grandement appréciée.

La création d'une zone d'inscription n'est pas le problème - je l'ai fait à plusieurs reprises. Je ne sais pas par où commencer avec le sous-domaine.

Merci, Ben.

123voto

Treffynnon Points 13385

Le résumé rapide

  1. Vous devez créer un domaine joker sur votre serveur DNS *.website.com
  2. Ensuite, dans le conteneur de votre serveur virtuel, vous devrez spécifier le caractère de remplacement *.website.com - Ceci est fait dans le champ ServerAlias DOCs
  3. Puis extraire et vérifier le sous-domaine en PHP et afficher les données appropriées

La version longue

1. Créer une entrée DNS joker

Dans vos paramètres DNS, vous devez créer un fichier entrée de domaine joker comme *.example.org . Une entrée joker ressemble à ceci :

*.example.org.   3600  A  127.0.0.1

2. Inclure le joker dans le vhost

Ensuite, dans la configuration d'Apache, vous devez mettre en place un conteneur vhost qui spécifie le caractère générique dans le fichier ServerAlias DOCs directive. Un exemple de conteneur vhost :

<VirtualHost *:80>
  ServerName server.example.org
  ServerAlias *.example.org
  UseCanonicalName Off
</VirtualHost>

3. Déterminez le sous-domaine sur lequel vous vous trouvez en PHP.

Ensuite, dans vos scripts PHP, vous pouvez trouver le domaine en regardant dans le fichier $_SERVER super variable globale. Voici un exemple de saisie du sous-domaine en PHP :

preg_match('/([^.]+)\.example\.org/', $_SERVER['SERVER_NAME'], $matches);
if(isset($matches[1])) {
    $subdomain = $matches[1];
}

J'ai utilisé une expression rationnelle ici pour permettre aux personnes de visiter votre site via www.subdomain.example.org ou sous-domaine.example.org.

Si vous ne prévoyez jamais d'avoir affaire à www. (ou à d'autres sous-domaines), vous pouvez simplement utiliser une sous-chaîne comme suit :

$subdomain = substr(
                 $_SERVER['SERVER_NAME'], 0,
                 strpos($_SERVER['SERVER_NAME'], '.')
             );

Hébergement virtuel de masse

L'hébergement virtuel de masse est un système légèrement différent du précédent dans la mesure où vous l'utilisez généralement pour héberger de nombreux sites Web distincts plutôt que d'essayer de l'utiliser pour alimenter une application comme le propose la question.

J'ai déjà documenté mon environnement d'hébergement virtuel de masse basé sur mod_rewrite dans un article intitulé article sur mon blog que vous pouvez consulter si c'est la voie que vous souhaitez emprunter. Il y a aussi, bien sûr, le page de manuel Apache correspondante .

Apache dispose également d'une méthode interne de traitement de l'hébergement virtuel de masse qui est légèrement moins flexible que la méthode mod_rewrite que j'ai utilisée. Tout ceci est décrit sur le site web d'Apache Page de manuel sur l'hébergement virtuel de masse configuré dynamiquement .

12voto

Gumbo Points 279147

Vous pourriez autoriser tous les sous-domaines en premier lieu et vérifier ensuite si le sous-domaine est valide. Par exemple :

RewriteEngine on
RewriteCond %{HTTP_HOST} ^[^.]+\.example\.com$
RewriteRule !^index\.php$ index.php [L]

A l'intérieur de la index.php vous pouvez ensuite extraire le sous-domaine en utilisant :

if (preg_match('/^([^.]+)\.example\.com$/', $_SERVER['HTTP_HOST'], $match)) {
    var_dump($match[1]);
}

Mais tout cela nécessite que votre serveur web accepte chaque nom de sous-domaine.

7voto

Rowland Shaw Points 22860

Outre la mise en place d'un wildcard DNS, vous pouvez également consulter les sites suivants Hébergement virtuel de masse dynamique pour Apache C'est ainsi que j'ai résolu ce problème dans le passé.

5voto

Glavić Points 13021

Le moyen le plus simple est de rediriger tous les sous-domaines (avec le caractère générique *) pour qu'ils pointent vers votre /wwwroot. Ensuite, mettez le fichier .htaccess dans ce dossier avec le code suivant :

RewriteCond %{ENV:REDIRECT_SUBDOMAIN} ="" 
RewriteCond %{HTTP_HOST} ^([a-z0-9][-a-z0-9]+)\.domain\.com\.?(:80)?$ [NC] 
RewriteCond %{DOCUMENT_ROOT}/%1 -d 
RewriteRule ^(.*) %1/$1 [E=SUBDOMAIN:%1,L] 
RewriteRule ^ - [E=SUBDOMAIN:%{ENV:REDIRECT_SUBDOMAIN},L]

Ainsi, tous les sous-dossiers du dossier /wwwroot seront acceptés via un sous-domaine (foldername.domain.com).

J'ai trouvé ça il y a des années sur http://www.webmasterworld.com/apache/3163397.htm

4voto

chaos Points 69029

Cela n'a rien à voir avec .htaccess. Vous devrez configurer des enregistrements DNS et un hébergement virtuel pour les sous-domaines.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X