it-swarm.com.de

Erstellen Sie spontan Subdomains mit .htaccess (PHP)

Ich möchte ein System erstellen, das bei der Anmeldung auf meiner Website eine Unterdomäne für den Benutzerkontobereich erstellt. 

z.B. johndoe.website.com

Ich denke, es hätte etwas mit der .htaccess-Datei zu tun und möglicherweise auf einen anderen Speicherort auf der Website umzuleiten. Ich weiß es eigentlich nicht. Aber jede Information, die mich anspricht, wäre sehr dankbar.

Das Erstellen eines Anmeldebereichs ist nicht das Problem - das habe ich schon oft gemacht. Ich bin nur unsicher, wo ich mit der Subdomain anfangen soll. 

119
Ben McRae

Der kurze Abriss

  1. Sie müssen eine Wildcard-Domäne auf Ihrem DNS-Server * .website.com erstellen
  2. Dann müssen Sie in Ihrem Vhost-Container auch den Platzhalter angeben. * .Website.com - Dies geschieht in der ServerAlias DOCs
  3. Dann extrahieren und überprüfen Sie die Subdomain in PHP und zeigen Sie die entsprechenden Daten an

Die lange Version

1. Erstellen Sie einen Platzhalter-DNS-Eintrag

In Ihren DNS-Einstellungen müssen Sie einen Wildcard-Domäneneintrag erstellen, z. B. *.example.org. Ein Platzhalter-Eintrag sieht folgendermaßen aus:

*.example.org.   3600  A  127.0.0.1

2. Fügen Sie den Platzhalter in vhost ein

Als nächstes müssen Sie in der Apache-Konfiguration einen Vhost-Container einrichten, der den Platzhalter in ServerAlias angibt. DOCs Direktive. Ein Beispiel für einen vhost-Container:

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

3. Finden Sie heraus, in welcher Subdomäne Sie sich in PHP befinden

In Ihren PHP -Skripten können Sie die Domäne herausfinden, indem Sie in der globalen Variablen $_SERVER nachschauen. Hier ist ein Beispiel für den Zugriff auf die Subdomain in PHP:

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

Ich habe den Regex hier verwendet, um Personen zu erlauben, die Ihre Website über www.subdomain.example.org oder subdomain.example.org besuchen.

Wenn Sie niemals damit rechnen, sich mit www auseinanderzusetzen? (oder andere Subdomains), dann können Sie einfach einen Teilstring wie folgt verwenden:

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

Massenvirtuelles Hosting

Virtuelles Massenhosting ist ein etwas anderes Schema als das oben genannte, da Sie es normalerweise zum Hosten vieler verschiedener Websites verwenden würden, anstatt zu versuchen, es mit einer Anwendung zu betreiben, wie es die Frage vorschlägt.

Ich habe meine auf Mod_rewrite basierende virtuelle Massenhosting-Umgebung zuvor in einem post auf meinem Blog dokumentiert, den Sie sich ansehen können, wenn dies die gewünschte Route ist. Natürlich gibt es auch die jeweilige Apache-Handbuchseite .

Apache hat auch einen internen Umgang mit Massen-Virtual-Hosting, der etwas weniger flexibel ist als die von mir verwendete Methode mod_rewrite. Dies ist alles auf der Handbuchseite zu Apache Dynamically Configured Mass Virtual Hosting beschrieben.

121
Treffynnon

Sie können zunächst jede Subdomain zulassen und dann prüfen, ob die Subdomain gültig ist. Zum Beispiel:

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

Im index.php können Sie die Subdomain dann mit Hilfe von:

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

Dies setzt jedoch voraus, dass Ihr Webserver jeden Namen der Unterdomäne akzeptiert.

12
Gumbo

Zusätzlich zum Einrichten eines DNS-Platzhalters sollten Sie unter Dynamic Mass Virtual Hosting für Apache nachsehen, wie ich es in der Vergangenheit gelöst habe

7
Rowland Shaw

Ich habe es mit PHP einfacher gemacht. In der Tat wird eine Subdomain in cPanel erstellt und Ihr Ordner unter dem gewünschten Domainnamen erstellt. Sie werden es zwar manuell in cPanel tun, aber alles wird in Millisekunden mit einer einfachen Funktion PHP erledigt. Kein Klick nötig :)

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.

Der einfachste Weg ist, alle Subdomains (mit Platzhalter *) so umzuleiten, dass sie auf /wwwroot..__ zeigen. Dann geben Sie .htaccess in den folgenden Ordner ein:

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]

Dadurch wird erreicht, dass jeder Unterordner des/wwwroot-Ordners über die Unterdomäne (Ordnername.Domäne.com) akzeptabel ist.

Vor Jahren gefunden on http://www.webmasterworld.com/Apache/3163397.htm

5
Glavić

Mod_vhost_alias ist das richtige Modul, um dies zu tun.

Mit einer Zeile können Sie Apache anweisen, an die richtige Stelle zu schauen, mit Verzeichnis-Hashing usw. usw .. Zum Beispiel die Zeile:

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

würde Apache anweisen, das Dokumentstammverzeichnis auf/http/users/s/u/subdomain festzulegen, wenn es für subdomain.ihredomain.com angefordert wird

4
Julien Tartarin

Es hat nichts mit .htaccess zu tun. Sie müssen DNS-Einträge und virtuelles Hosting für die Subdomains einrichten.

4
chaos

Ich denke, das Wildcard-DNS mit Apaches Dynamic Mass Virtual Hosting ist auch eine vernünftige Lösung. Obwohl ich es noch nie probiert habe.

Wenn Sie auf mehrere Server skalieren müssen oder die anderen Lösungen für Sie nicht funktionieren, empfehle ich die Verwendung eines datenbankgesteuerten DNS-Servers. Ich habe MyDNS in der Vergangenheit erfolgreich verwendet. Da MySQL (oder PostgreSQL) verwendet wird, können Sie Ihr DNS im laufenden Betrieb mit PHP oder einem anderen Vorgang aktualisieren. Der Code sieht zwar nicht so aus, als wäre er seit einiger Zeit aktualisiert worden, aber er ist DNS und daher nicht gerade schneidend. 

0
Barrett Conrad

Methoden zur Erstellung von Platzhaltern für Subdomains

Zuerst müssen Sie die DNS-Einstellungen mit Ihrem Server-DNS-Editor erstellen.

  1. Erstellen Sie einen A-Eintrag in den DNS-Einstellungen mit Host *-Platzhalter in der Server-IP-Adresse. 

    * 1400 IN A ip_address

  2. Erstellen Sie erneut einen A-Eintrag in den DNS-Einstellungen mit Host @ oder domain_name.tld in der Server-IP-Adresse. tld bedeutet Top-Level-Domains oder die Erweiterung der Domains wie .com, .org usw.

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

  3. Erstellen Sie einen CNAME-Datensatz wie folgt:

    www 1400 IN A domainname.tld

  4. Erstellen Sie die Subdomain mit * als Platzhalter wie *.domain.tld.
  5. Erstellen Sie htaccess in Ihrem Subdomain-Verzeichnis von *.domain.tld und geben Sie diesen Code ein:

    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
    

    Testen Sie Ihre erste Wildcard-Subdomain wie example.domainname.tld.

Wenn Sie nicht daran interessiert sind, die Daten als Parameter mit dem Zugriff "htaccess" zu übergeben, können Sie die Daten auch mithilfe der folgenden Codierung abrufen:

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();

und verwenden Sie Ihre globale Variable an jedem Ort wie global $get_data.

echo $get_data->data; //example

(Anmerkung: Diese Klasse wird hauptsächlich für das Abrufen des exakten Subdomainnamens von http_Host verwendet. Da einige zusätzliche Namen vor Ihrer Subdomäne auch wie www.example.domainname.tld verwendet werden können. Diese Rückgabe $_GET['data']='wwww'. Daher empfiehlt es sich, $_SERVER['http_Host'] zu verwenden, anstatt die $_SERVER['query_string']-Werte zu verwenden. oder übergebene htaccess-Parameter auf Ihrer Indexseite)

6.Beschleunigen Sie die Ausführung dieser Platzhalter-Subdomains, verwenden Sie N Sekunden in TTL - DNS SETTINGS.

7.Überprüfen Sie die Subdomain nach der angegebenen TTL-Zeit (600 - 10 Minuten) wie => http://abc.domain.tld

(Hinweis: Platzhalter-Subdomains überschreiben nicht die vorhandenen Subdomains. Weil Erste Priorität immer für Ihre vorhandenen Subdomains gilt.)

0