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.
ServerAlias
DOC 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
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>
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'], '.')
);
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 .
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.
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é
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";
}
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
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
Cela n'a rien à voir avec .htaccess. Vous devrez configurer des enregistrements DNS et un hébergement virtuel pour les sous-domaines.
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.
Tout d'abord, vous devez créer les paramètres DNS à l'aide de l'éditeur DNS de votre serveur.
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
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
Créez un enregistrement CNAME
comme:
www 1400 IN A domainname.tld
*
tel que *.domain.tld
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)