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

162

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 en fait simplement possible de le créer via du code php pur ou j'ai besoin d'utiliser un langage externe côté serveur de script?

A ceux qui ont répondu: Eh bien, devrais-je demander à mon hébergement s'il fournit une sorte d'accès DNS?

Skuta
la source
Il n'est peut-être pas nécessaire de demander à votre fournisseur un accès DNS, car le routage du sous-domaine (réponse de Mark) est déjà activé! Essayez simplement dans votre navigateur si les sous-domaines vous donnent un résultat. Et puis les acheminer avec le fichier .htaccess.
powtac
Si vous pouvez utiliser, wildcard subdomainscela peut être réalisé dans .htaccess. Voir ma solution.
Dan Bray

Réponses:

135

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 pour ajouter réellement l'enregistrement dépendra de votre hôte.


Le faire comme http://mywebsite.com/user serait beaucoup plus facile à configurer si c'est 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 az


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

RewriteCond %{HTTP_HOST} ^(^.*)\.mywebsite.com
RewriteRule (.*)  dostuff.php?username=%1
Mark Biek
la source
1
À moins que chaque sous-domaine ne soit desservi par un serveur différent, je pense que la création d'enregistrements de nom canonique (CNAME) serait un meilleur plan. en.wikipedia.org/wiki/List_of_DNS_record_types
theraccoonbear
Le sous-domaine a l'air bien. Cela demandera beaucoup plus de travail à mettre en place car vous devrez vous assurer que toutes les demandes de sous-domaine sont traitées correctement. Ce n'est pas terrible avec Apache mais peut être délicat dans un environnement hébergé.
Mark Biek
@theraccoonbear En supposant que vous puissiez également utiliser des jokers avec CNAME, c'est une idée.
Mark Biek
3
J'aurais dû être plus précis. .htaccess est pour Apache, pas pour IIS. Je ne sais pas comment la réécriture d'url est gérée avec IIS, mais je crois qu'il y a eu quelques questions à ce sujet sur SO.
Mark Biek
1
salut mark, j'ai suivi les étapes que vous avez données ci-dessus mais lorsque je fais xyz.mydomain.com, il redirige vers xyz.mydomain.com/cgi-sys/defaultwebpage.cgi ... Dois-je faire autre chose que les étapes mentionnées ci-dessus ?
Ashish Rajan
30

La fonctionnalité que vous recherchez est appelée sous- domaines génériques . Cela vous permet de ne pas avoir à configurer DNS pour chaque sous-domaine et d'utiliser à la place des réécritures apache pour la redirection. Vous pouvez trouver un beau tutoriel 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, comme il a nécessité l'utilisation de VirtualHosts, il doit être défini dans le fichier httpd.conf du serveur, au lieu d'un .htaccess local.

balupton
la source
Je ne peux pas atteindre le fichier httpd.conf car je suis sur un hébergement partagé. Que puis-je faire?
Webber Depor
23

Je le fais un peu différemment de Mark. Je passe le domaine entier et récupère 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 à 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'exploser mon nom d'utilisateur hors du nom d'hôte. Cela me donne de jolies URL de référencement.

gradbot
la source
14

Nous configurons un DNS générique comme expliqué ci-dessus. Donc, l'enregistrement a est * .votrenom.com

Ensuite, tous les sous-domaines vont en fait 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 la $accountvariable de la même manière que le 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 décrites ci-dessus, mais si vous n'avez pas accès à BIND et / ou à un .htaccess limité, cette méthode devrait fonctionner (tant que votre hôte configurera le caractère générique pour vous).

Nous utilisons en fait cette méthode pour nous connecter à la base de données des clients pour une application de commerce électronique multi-entreprises, mais cela peut également fonctionner pour vous.

Volomike
la source
2
Je pense que cela devrait être une réponse actuelle, demandez-vous comment PHP gère sous-entendu PAS Comment les serveurs Web ou DNS gèrent les sous-domaines.
Salem le
8

Ne vous embêtez pas avec les fichiers .htaccess lorsque vous pouvez utiliser l' 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_ROOTn'est pas correctement définie sur le sous-répertoire utilisé , mais sur la racine_document par défaut dans de htconfig.

Willem
la source
1
Je ne sais pas trop comment utiliser ça .. et au final, pourquoi ne pas gâcher htaccess?
Skuta
6

Solution PHP simple pour les sous-domaines et les applications Web multi-domaines

Étape 1. Fournissez l'enregistrement DNS A comme "*" pour les domaines (ou domaine) que vous allez servir "example.org"

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

Étape 2. Vérifiez l'unicité des connexions lors de l'enregistrement ou du changement de connexion de l'utilisateur. Évitez également 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 servis différemment, vous devrez peut-être stocker 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 
Alex Khimich
la source
4

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

garenne
la source
4

En plus des modifications de configuration sur votre serveur WWW pour gérer le nouveau sous-domaine, votre code devra apporter des modifications à vos enregistrements DNS. Donc, à moins que vous n'exécutiez votre propre BIND (ou similaire), vous devrez comprendre comment accéder à la configuration de votre fournisseur de serveur de noms. S'ils n'offrent pas une sorte d'API, cela peut devenir délicat.

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 de consommateurs ne le font pas. J'ai recherché sur Google les API GoDaddy et les API DNS GoDaddy, mais je n'ai rien pu activer, alors je suppose que la meilleure option serait de consulter l'aide en ligne avec votre fournisseur, et si cela ne répond pas à la question, contactez-nous de leur personnel de soutien.

ourson
la source
3

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 nommé manuellement *. J'ai également spécifié un dossier appelé subdomainscomme racine du document pour les sous-domaines génériques. Ajoutez ceci à un .htaccessfichier dans votre dossier de 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, tout ce que vous avez à faire est de créer un dossier dans votre dossier sous-domaines, puis de placer les fichiers du sous-domaine dans ce répertoire.

Dan Bray
la source
3

Cela peut être réalisé à .htaccesscondition 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 nommé manuellement *et en spécifiant un dossier appelé sous-domaines comme racine du document pour les sous-domaines génériques. Ajoutez ceci à votre .htaccessfichier:

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.

Dan Bray
la source
1

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

kiwixz
la source
0

Créer des sous-domaines dynamiques en utilisant PHP et Htaccess

(1) .htaccess racine

Ce fichier est la redirection http://www.yourwebsite.com vers http://yourwebsite.com pour une utilisation sur la page d'accueil. Toute la redirection du sous-domaine vers yourwebsite_folder

RewriteEngine On

RewriteCond %{HTTP_HOST} ^www.yourwebsite.com
RewriteRule (.*) http://yourwebsite.com/$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^yourwebsite\.com $
RewriteCond %{REQUEST_URI} !^/yourwebsite_folder/
RewriteRule (.*) /yourwebsite_folder/$1

RewriteCond %{HTTP_HOST} ^(^.*)\.yourwebsite.com
RewriteCond %{REQUEST_URI} !^/yourwebsite_folder/
RewriteRule (.*) /yourwebsite_folder/$1

(2) Dossier intérieur .htaccess

Ce fichier réécrit les URL du sous-domaine.

http://yourwebsite.com/index.php?siteName=9lessons à http://9lessons.yourwebsite.com

Options +FollowSymLinks
RewriteEngine On

RewriteBase /

RewriteRule ^([aA-zZ])$ index.php?siteName=$1
RewriteCond %{HTTP_HOST} ^(^.*)\.yourwebsite.com
RewriteRule (.*) index.php?siteName=%1

Autres astuces .htaccess: Tutoriel et astuces sur les fichiers Htaccess.

index.php

Ce fichier contient du code PHP simple, utilisant des expressions régulières validant la valeur du sous-domaine.

<?php
$siteName='';
if($_GET['siteName'] )
{
$sitePostName=$_GET['siteName'];
$siteNameCheck = preg_match('~^[A-Za-z0-9_]{3,20}$~i', $sitePostName);
   if($siteNameCheck)
   {
     //Do something. Eg: Connect database and validate the siteName.
   }
   else
  {
    header("Location: http://yourwebsite.com/404.php");
   }
}
?>
//HTML Code
<!DOCTYPE html>
<html>
<head>
<title>Project Title</title>
</head>
<body>
<?php if($siteNameCheck) { ?>
//Home Page
<?php } else { ?>
//Redirect to Subdomain Page.
<?php } ?>
</body>
</html>

Aucun dossier de sous-domaine

Si vous utilisez le répertoire racine (htdocs / public_html) comme répertoire de projet, utilisez ce fichier .htaccess suivant.

Options +FollowSymLinks
RewriteEngine On

RewriteBase /

RewriteCond %{HTTP_HOST} ^www.yourwebsite.com
RewriteRule (.*) http://yourwebsite.com/$1 [R=301,L]

RewriteRule ^([aA-zZ])$ index.php?siteName=$1
RewriteCond %{HTTP_HOST} ^(^.*)\.yourwebsite.com
RewriteRule (.*) index.php?siteName=%1
Abdo-hôte
la source