web-dev-qa-db-fra.com

Créez 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 de compte utilisateur. 

par exemple. johndoe.website.com

Je pense que ce serait quelque chose à voir avec le fichier .htaccess et éventuellement rediriger vers un autre emplacement sur le site? Je ne sais pas vraiment. Mais toute information pour me lancer serait grandement appréciée.

Créer un espace d’inscription n’est pas un problème, c’est ce que j’ai fait autant de fois. Je ne sais pas par où commencer avec le sous-domaine. 

119
Ben McRae

Le bref aperçu

  1. Vous devez créer un domaine générique sur votre serveur DNS * .website.com
  2. Ensuite, dans votre conteneur vhost, vous devrez également spécifier le caractère générique * .website.com - Ceci est effectué dans le ServerAlias DOC
  3. Puis extrayez et vérifiez le sous-domaine dans PHP et affichez les données appropriées

La version longue

1. Créer une entrée DNS générique

Dans vos paramètres DNS, vous devez créer une entrée de domaine générique telle que *.example.org. Une entrée générique ressemble à ceci:

*.example.org.   3600  A  127.0.0.1

2. Inclure le caractère générique dans vhost

Dans la configuration d’Apache, vous devez ensuite configurer un conteneur vhost qui spécifie le caractère générique dans le ServerAlias DOC directive. Un exemple de conteneur vhost:

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

3. Déterminez le sous-domaine que vous utilisez en PHP

Ensuite, dans vos scripts PHP, vous pouvez connaître le domaine en consultant la variable super globale $_SERVER. Voici un exemple de récupération du sous-domaine en PHP:

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

J'ai utilisé regex ici pour permettre aux personnes qui visitent votre site via www.subdomain.example.org ou subdomain.example.org.

Si vous ne vous attendez jamais à avoir à traiter avec www. (ou d'autres sous-domaines), vous pouvez simplement utiliser une sous-chaîne comme ceci:

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

Hébergement virtuel de masse

L'hébergement virtuel de masse est un schéma légèrement différent de ce qui est décrit ci-dessus en ce sens que vous l'utiliseriez généralement pour héberger de nombreux sites Web distincts au lieu 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 publication sur mon blog , que vous pouvez consulter si tel est le chemin que vous souhaitez suivre. Il y a aussi, bien sûr, la page de manuel Apache correspondante .

Apache a également une façon interne de gérer l’hébergement virtuel de masse qui est légèrement moins flexible que la méthode mod_rewrite que j’ai utilisée. Ceci est décrit dans la section Apache page de manuel Hébergement virtuel de masse configurée dynamiquement .

121
Treffynnon

Vous pouvez autoriser chaque sous-domaine en premier lieu, puis vérifier si le sous-domaine est valide. Par exemple:

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

Dans le index.php, vous pouvez 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 tous les noms de sous-domaines.

12
Gumbo

En plus de la configuration d'un caractère générique DNS, vous voudrez peut-être jeter un coup d'œil à Hébergement virtuel de masse dynamique pour Apache c'est ce que j'ai résolu dans le passé

7
Rowland Shaw

J'ai trouvé plus facile de le faire avec PHP. En fait, créez un sous-domaine dans cPanel et créez votre dossier sous le nom de domaine souhaité. Comme vous le ferez manuellement dans cPanel mais tout se fera en millisecondes avec une simple fonction PHP. Pas de clic nécessaire :)

function create_subdomain($subDomain,$cPanelUser,$cPanelPass,$rootDomain) {

    //  $buildRequest = "/frontend/x3/subdomain/doadddomain.html?rootdomain=" . $rootDomain . "&domain=" . $subDomain;

    $buildRequest = "/frontend/x3/subdomain/doadddomain.html?rootdomain=" . $rootDomain . "&domain=" . $subDomain . "&dir=public_html/subdomains/" . $subDomain;

    $openSocket = fsockopen('localhost',2082);
    if(!$openSocket) {
        return "Socket error";
        exit();
    }

    $authString = $cPanelUser . ":" . $cPanelPass;
    $authPass = base64_encode($authString);
    $buildHeaders  = "GET " . $buildRequest ."\r\n";
    $buildHeaders .= "HTTP/1.0\r\n";
    $buildHeaders .= "Host:localhost\r\n";
    $buildHeaders .= "Authorization: Basic " . $authPass . "\r\n";
    $buildHeaders .= "\r\n";

    fputs($openSocket, $buildHeaders);
        while(!feof($openSocket)) {
           fgets($openSocket,128);
        }
    fclose($openSocket);

    $newDomain = "http://" . $subDomain . "." . $rootDomain . "/";

   //  return "Created subdomain $newDomain";

}
5
Adrian P.

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.Alors, mettez .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]

Cela permettra d’obtenir que tous les sous-dossiers du dossier/wwwroot soient acceptés via le sous-domaine (nomdossier.domaine.com).

Trouvé il y a quelques années le http://www.webmasterworld.com/Apache/3163397.htm

5
Glavić

Mod_vhost_alias est le bon module pour le faire.

Avec une ligne, vous pouvez demander à Apache de regarder au bon endroit, avec hachage de répertoire, etc., par exemple, la ligne:

VirtualDocumentRoot /http/users/%3.1/%3.2/%3

indiquerait à Apache de définir la racine du document sur/http/users/s/u/sous-domaine lorsque demandé pour sous-domaine.votredomaine.com

4
Julien Tartarin

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

4
chaos

Je pense que le joker DNS avec Dynamic Mass Virtual Hosting d'Apache est également une solution raisonnable. Bien que je ne l'ai jamais essayé.

Si vous avez besoin d'évoluer vers plusieurs serveurs ou si les autres solutions ne vous conviennent pas, je vous recommande d'utiliser un serveur DNS piloté par une base de données. J'ai utilisé avec succès MyDNS dans le passé. Puisqu'il utilise MySQL (ou PostgreSQL), vous pouvez mettre à jour votre DNS à la volée avec PHP ou à peu près n'importe quoi d'autre. Le code ne semble pas avoir été mis à jour depuis un moment, mais il s'agit de DNS et donc de ne pas couper exactement Edge. 

0
Barrett Conrad

Méthodes de création de sous-domaines génériques

Tout d'abord, vous devez créer les paramètres DNS à l'aide de l'éditeur DNS de votre serveur.

  1. Créez un enregistrement A dans les paramètres DNS avec le caractère générique Host * dans l'adresse IP du serveur. 

    * 1400 IN A ip_address

  2. Créez à nouveau un enregistrement A dans les paramètres DNS avec l'hôte @ ou domain_name.tld dans l'adresse IP du serveur. tld signifie les domaines de premier niveau ou l’extension de domaines tels que .com, .org, etc ....

    @ 1400 IN A ip_address ou domain_name.tld 1400 IN A ip_address

  3. Créez un enregistrement CNAME comme:

    www 1400 IN A domainname.tld

  4. Créez le sous-domaine avec le caractère générique * tel que *.domain.tld
  5. Créez htaccess dans votre répertoire de sous-domaine de *.domain.tld et mettez ce code:

    Options +FollowSymLinks 
    RewriteEngine On 
    RewriteBase /
    RewriteRule ^([aA-zZ0-9]+)$ index.php?data=$1
    RewriteCond %{HTTP_Host} ^([aA-zZ0-9]+)\.([aA-zZ0-9-]+)\.([aA-zZ]+)
    RewriteRule ([aA-zZ0-9]+) index.php?data=%1
    

    Testez votre premier sous-domaine générique tel que example.domainname.tld

Si vous n'êtes pas intéressé pour transmettre les données en tant que paramètre à l'aide de htaccess, vous pouvez également obtenir les données en utilisant le codage suivant:

define("SUBDOMAIN_PARENT","domainname.tld");   
class getData
    {
         function __construct()
        {
            $this->data="";
            $http_Host=$_SERVER['HTTP_Host'];
         $subdom_data= str_replace(SUBDOMAIN_PARENT,"",$http_Host);
         $expl_subdom_data=explode(".",$subdom_data);
      $expl_subdom_data=array_filter($expl_subdom_data);

            if($expl_subdom_data!=NULL)
            {
           $this->data=end($expl_subdom_data);
            }
       }
    }
$GLOBALS['get_data']=new getData();

et utilisez votre variable globale à n’importe quel endroit comme global $get_data.

echo $get_data->data; //example

(Remarque: Cette classe est principalement utilisée pour obtenir le nom de sous-domaine exact à partir de http_Host. Certains noms supplémentaires combinés avant votre sous-domaine étant également applicables, comme www.example.domainname.tld. this return $_GET['data']='wwww'. Je vous suggère donc d'utiliser $_SERVER['http_Host'] pour obtenir les valeurs exactes au lieu d'utiliser $_SERVER['query_string']. ou passé des paramètres htaccess dans votre page d'index)

6.Accélérez l'exécution de ce sous-domaine générique, utilisez N secondes dans TTL - REGLAGES DNS.

7.Vérifiez le sous-domaine après votre heure ttl donnée (600 - 10 minutes) comme => http://abc.domain.tld

(Remarque: les sous-domaines génériques ne remplacent pas les sous-domaines existants. Parce que la priorité est toujours accordée à vos sous-domaines existants)

0