Subdomains on the fly erstellen mit .htaccess (PHP)

Lesezeit: 7 Minuten

Subdomains on the fly erstellen mit htaccess PHP
Ben McRae

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

zB johndoe.website.com

Ich denke, es würde etwas mit der .htaccess-Datei zu tun haben und möglicherweise zu einer anderen Stelle auf der Website umgeleitet werden? Ich weiß es nicht. Aber jede Information, um mich anzufangen, wäre sehr dankbar.

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

Subdomains on the fly erstellen mit htaccess PHP
Treffynnon

Der Schnelldurchlauf

  1. Sie müssen eine Wildcard-Domain auf Ihrem DNS-Server *.website.com erstellen
  2. Dann müssen Sie in Ihrem vhost-Container auch den Platzhalter *.website.com angeben – Dies geschieht in der ServerAlias DOCs
  3. Extrahieren und verifizieren Sie dann 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 eine Wildcard-Domain-Eintrag wie zum Beispiel *.example.org. Ein Wildcard-Eintrag sieht so 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 der ServerAlias DOCs Richtlinie. Ein Beispiel für einen vhost-Container:

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

3. Finden Sie heraus, auf welcher Subdomain Sie sich in PHP befinden

Dann können Sie in Ihren PHP-Skripten die Domäne herausfinden, indem Sie in die $_SERVER Super globale Variable. Hier ist ein Beispiel für das Erfassen der Subdomain in PHP:

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

Ich habe hier Regex verwendet, um es Leuten zu ermöglichen, Ihre Website über www.subdomain.example.org oder subdomain.example.org zu besuchen.

Wenn Sie nie damit rechnen, sich mit www. (oder andere Subdomains) dann könnten Sie einfach eine Teilzeichenfolge wie folgt verwenden:

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

Virtuelles Massenhosting

Virtuelles Massenhosting ist ein etwas anderes Schema als das oben genannte, da Sie es normalerweise verwenden würden, um viele verschiedene Websites zu hosten, anstatt zu versuchen, es für eine Anwendung zu verwenden, wie die Frage vorschlägt.

Ich habe meine auf mod_rewrite basierende virtuelle Massenhosting-Umgebung zuvor in a dokumentiert auf meinem Blog posten, die Sie sich ansehen könnten, wenn dies die Route ist, die Sie nehmen möchten. Natürlich gibt es auch die entsprechende Apache-Handbuchseite.

Apache hat auch eine interne Art, mit virtuellem Massenhosting umzugehen, die etwas weniger flexibel ist als die von mir verwendete mod_rewrite-Methode. Dies ist alles auf dem Apache beschrieben Handbuchseite Dynamisch konfiguriertes virtuelles Massenhosting.

  • Vorausgesetzt, Sie können verwenden wildcard subdomainssiehe meine Lösung, um dies zu tun in .htaccess.

    – Dan Bray

    6. April 2016 um 19:02 Uhr

  • Ich glaube nicht, dass ein virtueller Host aus .htaccess hinzugefügt werden kann, es macht mich auch nervös wegen der Sicherheit. Ab 2.4 sollte es möglich sein, ein Basisverzeichnis abhängig vom Hostnamen auszuwählen (Aber Dans Methode hat auch einige Probleme). RewriteRule "^/?(.*)" "http://%{HTTP_HOST}/%{HTTP_HOST}/$1" [L,R,NE]

    – Symbohne

    2. Juni 2017 um 10:49 Uhr


  • Beachten Sie, dass der PHP-Code, der dies implementiert, NICHT als Webserver-UID ausgeführt werden darf (sollte als dedizierter Benutzer über sudo erfolgen).

    – Symbohne

    2. Juni 2017 um 10:52 Uhr


Sie könnten 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 Inneren des index.php Sie können dann die Subdomain extrahieren mit:

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

All dies erfordert jedoch, dass Ihr Webserver jeden Subdomain-Namen akzeptiert.

  • Darüber hinaus erfordert es, dass Ihr DNS-Server jeden Subdomain-Namen auflöst.

    – Chaos

    25. Februar 2009 um 14:19 Uhr

  • Ich habe dies auf anderen Websites gesehen, müssen sie doch nicht jedes Mal jede Subdomain auflösen, oder?

    – Ben McRae

    25. Februar 2009 um 14:22 Uhr

  • Nun, es kommt darauf an, was man darunter versteht. Wenn Sie meinen, dass jedes Mal, wenn jemand im Internet nach foo.somedomain.com sucht und es nicht zwischengespeichert ist, sein DNS-Server es auflösen muss, dann ja.

    – Chaos

    25. Februar 2009 um 14:26 Uhr

  • Wenn Sie meinen, müssen sie DNS-Einträge speziell für jede Domain einrichten, siehe Treffynnons Antwort.

    – Chaos

    25. Februar 2009 um 14:31 Uhr

  • okay danke dafür. Ich verstehe nicht ganz, was Treffynnon mit der Angabe des Platzhalters im vhost meint?

    – Ben McRae

    25. Februar 2009 um 14:38 Uhr

Zusätzlich zum Einrichten eines DNS-Wildcards sollten Sie sich vielleicht einen Blick darauf werfen Dynamisches virtuelles Massenhosting für Apache so habe ich das in der Vergangenheit gelöst

Am einfachsten ist es, alle Subdomains (mit Platzhalter *) so umzuleiten, dass sie auf Ihr /wwwroot zeigen. Legen Sie dann .htaccess mit dem folgenden Code in diesen Ordner:

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 Ordners /wwwroot über die Subdomain (Ordnername.domain.com) akzeptiert wird.

Fand dies vor Jahren auf
http://www.webmasterworld.com/apache/3163397.htm

1646966649 738 Subdomains on the fly erstellen mit htaccess PHP
Adrian P.

Ich fand es einfacher, es mit PHP zu tun. Tatsächlich erstellen Sie eine Subdomain innerhalb von cPanel und erstellen Ihren Ordner unter dem gewünschten Domainnamen. Wie Sie es manuell in cPanel tun, aber alles wird in Millisekunden durch eine einfache PHP-Funktion 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 . "https://stackoverflow.com/";

   //  return "Created subdomain $newDomain";

}

  • Überprüfen Sie, ob es erfolgreich auf cPanel erstellt wurde, und überprüfen Sie per FTP (oder Dateimanager), was sich im Ordner public_html/subdomain befindet. Wenn Sie eine cPanel-Einstellung haben, die Dinge hinzufügt, wenn Sie eine Subdomain erstellen, hat dies nichts mit der Erstellung von Subdomains im laufenden Betrieb zu tun.

    – Adrian P.

    6. Dezember 2017 um 18:36 Uhr

  • Nein wurde nicht in cPanel erstellt

    – Ruchita Sheth

    7. Dezember 2017 um 5:21 Uhr

  • Dann haben Sie nicht genügend Berechtigungen für cPanel. Ist das Shared Hosting VPS oder dedizierter Server?

    – Adrian P.

    8. Dezember 2017 um 4:28 Uhr


  • Es kann mehrere Gründe dafür geben, die Subdomain nicht zu erstellen. Nicht im Zusammenhang mit dem obigen Skript, aber mit Ihrer DNS-Konfiguration. Lesen Sie das und bitten Sie in den cPanel-Foren um Hilfe. forums.cpanel.net/threads/subdomains-not-working.228132

    – Adrian P.

    10. Dezember 2017 um 16:46 Uhr

1646966649 491 Subdomains on the fly erstellen mit htaccess PHP
Chaos

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

  • Überprüfen Sie, ob es erfolgreich auf cPanel erstellt wurde, und überprüfen Sie per FTP (oder Dateimanager), was sich im Ordner public_html/subdomain befindet. Wenn Sie eine cPanel-Einstellung haben, die Dinge hinzufügt, wenn Sie eine Subdomain erstellen, hat dies nichts mit der Erstellung von Subdomains im laufenden Betrieb zu tun.

    – Adrian P.

    6. Dezember 2017 um 18:36 Uhr

  • Nein wurde nicht in cPanel erstellt

    – Ruchita Sheth

    7. Dezember 2017 um 5:21 Uhr

  • Dann haben Sie nicht genügend Berechtigungen für cPanel. Ist das Shared Hosting VPS oder dedizierter Server?

    – Adrian P.

    8. Dezember 2017 um 4:28 Uhr


  • Es kann mehrere Gründe dafür geben, die Subdomain nicht zu erstellen. Nicht im Zusammenhang mit dem obigen Skript, aber mit Ihrer DNS-Konfiguration. Lesen Sie das und bitten Sie in den cPanel-Foren um Hilfe. forums.cpanel.net/threads/subdomains-not-working.228132

    – Adrian P.

    10. Dezember 2017 um 16:46 Uhr

1646966649 43 Subdomains on the fly erstellen mit htaccess PHP
Julien

Mod_vhost_alias ist das richtige Modul dafür.

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

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

würde Apache anweisen, den Dokumentenstamm auf /http/users/s/u/subdomain zu setzen, wenn er für subdomain.yourdomain.com angefordert wird

989650cookie-checkSubdomains on the fly erstellen mit .htaccess (PHP)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy