Wie kann PHP Subdomain automatisch für jeden Benutzer erstellen?

162

Wie erstelle ich eine Subdomain wie http://user.mywebsite.com ? Muss ich irgendwie auf htaccess zugreifen? Ist es tatsächlich einfach möglich, es über reinen PHP-Code zu erstellen, oder muss ich eine externe Sprache auf der Seite des Skriptservers verwenden?

An diejenigen, die geantwortet haben: Nun, sollte ich mein Hosting fragen, ob sie eine Art DNS-Zugang bieten?

Skuta
quelle
Möglicherweise ist es nicht erforderlich, Ihren Provider um DNS-Zugriff zu bitten, da das Subdomain-Routing (Antwort von Mark) bereits aktiviert ist! Versuchen Sie es einfach in Ihrem Browser, wenn Subdomains ein Ergebnis liefern. Und leiten Sie sie dann mit der .htaccess-Datei weiter.
Powtac
Wenn Sie dies verwenden wildcard subdomainskönnen, kann dies in erreicht werden .htaccess. Siehe meine Lösung.
Dan Bray

Antworten:

135

Sie möchten einen benutzerdefinierten A-Datensatz erstellen .

Ich bin mir ziemlich sicher, dass Sie Platzhalter verwenden können, wenn Sie A-Datensätze angeben, mit denen Sie Folgendes tun können:

*.mywebsite.com       IN  A       127.0.0.1

127.0.0.1 wäre die IP-Adresse Ihres Webservers. Die Methode zum tatsächlichen Hinzufügen des Datensatzes hängt von Ihrem Host ab.


Machen Sie es wie http://mywebsite.com/userWenn Sie , ist die Einrichtung viel einfacher, wenn dies eine Option ist.

Dann können Sie einfach eine .htaccess-Datei hinzufügen, die folgendermaßen aussieht:

Options +FollowSymLinks

RewriteEngine On
RewriteRule ^([aA-zZ])$  dostuff.php?username=$1

Oben sind Benutzernamen auf die Zeichen az beschränkt


Die Umschreiberegel zum Abrufen der Subdomain würde folgendermaßen aussehen:

RewriteCond %{HTTP_HOST} ^(^.*)\.mywebsite.com
RewriteRule (.*)  dostuff.php?username=%1
Mark Biek
quelle
1
Wenn nicht jede Subdomain von einem anderen Server aus bedient wird, wäre es besser, CNAME-Datensätze (Canonical Name) zu erstellen. en.wikipedia.org/wiki/List_of_DNS_record_types
theraccoonbear
Die Subdomain sieht gut aus. Das Einrichten wird jedoch viel mehr Arbeit erfordern, da Sie sicherstellen müssen, dass alle Subdomain-Anforderungen ordnungsgemäß verarbeitet werden. Dies ist mit Apache nicht schrecklich, kann aber in einer gehosteten Umgebung schwierig sein.
Mark Biek
@theraccoonbear Angenommen, Sie können auch Platzhalter mit CNAME verwenden, ist das ein Gedanke.
Mark Biek
3
Ich hätte genauer sein sollen. .htaccess ist für Apache, nicht für IIS. Ich bin nicht sicher, wie das Umschreiben von URLs mit IIS gehandhabt wird, aber ich glaube, es gab einige Fragen zu SO.
Mark Biek
1
Hallo Markus, folgte ich den Schritten , die Sie oben gab , aber das , wenn ich xyz.mydomain.com es zu Umleitungen xyz.mydomain.com/cgi-sys/defaultwebpage.cgi ... Muss ich etwas anderes tun , dann werden die Schritte oben erwähnt ?
Ashish Rajan
30

Die Funktion, nach der Sie suchen, heißt Wildcard-Subdomains . Sie müssen nicht für jede Subdomain DNS einrichten, sondern müssen stattdessen Apache-Umschreibungen für die Umleitung verwenden. Sie können hier ein schönes Tutorial finden , aber es gibt Tausende von Tutorials. Hier ist der notwendige Code aus diesem Tutorial:

<VirtualHost 111.22.33.55>
    DocumentRoot /www/subdomain
    ServerName www.domain.tld
    ServerAlias *.domain.tld
</VirtualHost>

Da jedoch die Verwendung von VirtualHosts erforderlich ist, muss diese in der httpd.conf-Datei des Servers anstelle eines lokalen .htaccess festgelegt werden.

Balupton
quelle
Ich kann die Datei httpd.conf nicht erreichen, da ich auf Shared Hosting bin. Was kann ich tun?
Webber Depor
23

Ich mache es ein bisschen anders als Mark. Ich übergebe die gesamte Domain und greife nach der Subdomain in PHP.

RewriteCond {REQUEST_URI} !\.(png|gif|jpg)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php?uri=$1&hostName=%{HTTP_HOST}

Dies ignoriert Bilder und ordnet alles andere meiner index.php-Datei zu. Also wenn ich gehe

http://fred.mywebsite.com/album/Dance/now

Ich komme zurück

http://fred.mywebsite.com/index.php?uri=album/Dance/now&hostName=fred.mywebsite.com

Dann explodiere ich in meinem index.php-Code einfach meinen Benutzernamen aus dem Hostnamen. Dies gibt mir schöne hübsche SEO-URLs.

gradbot
quelle
14

Wir richten Wildcard-DNS wie oben erläutert ein. Der a-Datensatz lautet also * .yourname.com

Dann gehen alle Subdomains tatsächlich an den gleichen Ort, aber PHP behandelt jede Subdomain als ein anderes Konto.

Wir verwenden den folgenden Code:

$url=$_SERVER["REQUEST_URI"];
$account=str_replace(".yourdomain.com","",$url);

Dieser Code setzt die $accountVariable genauso wie die Subdomain. Sie können dann ihre Dateien und andere Informationen basierend auf ihrem Konto abrufen.

Dies ist wahrscheinlich nicht so effizient wie die oben aufgeführten Methoden. Wenn Sie jedoch keinen Zugriff auf BIND und / oder eingeschränkten Zugriff haben, sollte diese Methode funktionieren (solange Ihr Host den Platzhalter für Sie einrichtet).

Wir verwenden diese Methode tatsächlich, um eine Verbindung zur Kundendatenbank für eine unternehmensübergreifende E-Commerce-Anwendung herzustellen, sie funktioniert jedoch möglicherweise auch für Sie.

Volomike
quelle
2
Ich denke, dies sollte eine korrekte Antwort sein. Fragen Sie, wie PHP mit Submmoins umgeht, NICHT wie Web- oder DNS- Server Subdomains handhaben.
Salem
8

Machen Sie keine Probleme mit .htaccess-Dateien, wenn Sie virtuelles Apache-Massenhosting verwenden können .

Aus der Dokumentation:

#include part of the server name in the filenames VirtualDocumentRoot /www/hosts/%2/docs

In gewisser Weise ist es das Gegenteil Ihrer Frage: Jede "Subdomain" ist ein Benutzer. Wenn der Benutzer nicht existiert, erhalten Sie eine 404.

Der einzige Nachteil ist, dass die Umgebungsvariable DOCUMENT_ROOTnicht korrekt auf das verwendete Unterverzeichnis festgelegt ist, sondern auf das Standarddokument_root in de htconfig.

Willem
quelle
1
Ich bin mir nicht sicher, wie ich das verwenden soll. Und am Ende, warum nicht mit htaccess durcheinander bringen?
Skuta
6

Einfache PHP-Lösung für Subdomains und Multi-Domain-Webanwendungen

Schritt 1. Geben Sie einen DNS-Eintrag als "*" für Domains (oder Domains) an, für die Sie "example.org" bereitstellen möchten.

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

Schritt 2. Überprüfen Sie die Eindeutigkeit der Anmeldungen, wenn Sie sich anmelden oder die Anmeldung ändern. Vermeiden Sie außerdem Punkte in diesen Anmeldungen.

Schritt 3. Überprüfen Sie dann die Abfrage

        // 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
        }

?>

Diese Lösung kann verschiedene Domänen bedienen

qwerty.example.org
qwerty.example.net 

johnsmith.somecompany.com
paulsmith.somecompany.com

Wenn Sie dieselben Nicks für verschiedene Domains benötigen, die unterschiedlich bedient werden, müssen Sie möglicherweise die Benutzerauswahl für die Domain speichern, wenn Sie sich anmelden.

smith.example.org // Show info about John Smith
smith.example.net // Show info about Paul Smith 
Alex Khimich
quelle
4

Sie könnten [möglicherweise] die URL neu schreiben, aber ja: Sie müssen die Kontrolle über Ihre DNS-Einstellungen haben, damit ein Benutzer beim Hinzufügen eine eigene Subdomain erhält.

Labyrinth
quelle
4

Zusätzlich zu den Konfigurationsänderungen auf Ihrem WWW-Server zur Verarbeitung der neuen Subdomain muss Ihr Code Änderungen an Ihren DNS-Einträgen vornehmen. Sofern Sie nicht Ihr eigenes BIND (oder ähnliches) ausführen, müssen Sie herausfinden, wie Sie auf die Konfiguration Ihres Nameserver-Anbieters zugreifen können. Wenn sie keine API anbieten, kann dies schwierig werden.

Update: Ja, ich würde mich bei Ihrem Registrar erkundigen, ob dieser auch den Nameserver-Service anbietet (wie dies häufig der Fall ist). Ich habe diese Option noch nie untersucht, aber ich vermute, dass die meisten Verbraucher-Registrare dies nicht tun. Ich habe nach GoDaddy-APIs und GoDaddy-DNS-APIs gegoogelt, konnte aber nichts aufdecken. Ich denke, die beste Option wäre, die Online-Hilfe bei Ihrem Anbieter zu lesen. Wenn dies die Frage nicht beantwortet, halten Sie inne ihrer Support-Mitarbeiter.

Theraccoonbear
quelle
3

Zunächst müssen Sie sicherstellen, dass Ihr Server so konfiguriert ist, dass Platzhalter-Subdomänen zulässig sind. Dies habe ich in JustHost erreicht, indem ich eine manuell benannte Subomain erstellt habe *. Ich habe auch einen Ordner angegeben, der subdomainsals Dokumentstamm für Platzhalter-Subdomänen bezeichnet wird. Fügen Sie dies einer .htaccessDatei in Ihrem Subdomains-Ordner hinzu:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.website\.com$
RewriteCond %{HTTP_HOST} ^(\w+)\.website\.com$
RewriteCond %{REQUEST_URI}:%1 !^/([^/]+)/([^:]*):\1
RewriteRule ^(.*)$ /%1/$1 [QSA]

Schließlich müssen Sie nur einen Ordner in Ihrem Subdomain-Ordner erstellen und dann die Dateien der Subdomain in diesem Verzeichnis ablegen.

Dan Bray
quelle
3

Dies kann erreicht werden, .htaccesssofern Ihr Server so konfiguriert ist, dass Platzhalter-Subdomänen zugelassen werden. Dies habe ich in JustHost erreicht, indem ich eine manuell benannte *Subdomäne erstellt und einen Ordner namens Subdomains als Dokumentstamm für Platzhalter-Subdomains angegeben habe. Fügen Sie dies Ihrer .htaccessDatei hinzu:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.website\.com$
RewriteCond %{HTTP_HOST} ^(\w+)\.website\.com$
RewriteCond %{REQUEST_URI}:%1 !^/([^/]+)/([^:]*):\1
RewriteRule ^(.*)$ /%1/$1 [QSA]

Erstellen Sie abschließend einen Ordner für Ihre Subdomain und platzieren Sie die Subdomain-Dateien.

Dan Bray
quelle
1

Ich wollte nur hinzufügen, dass Sie, wenn Sie CloudFlare (kostenlos) verwenden, deren API verwenden können, um Ihre DNS problemlos zu verwalten.

Kiwixz
quelle
0

Erstellen Sie dynamische Subdomains mit PHP und Htaccess

(1) Root .htaccess

Diese Datei wird http://www.yourwebsite.com zur Verwendung auf der Startseite an http://yourwebsite.com umgeleitet . Die gesamte Subdomain-Umleitung zu 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) Innerhalb des Ordners .htaccess

Diese Datei schreibt die URLs der Subdomain neu.

http://yourwebsite.com/index.php?siteName=9lessons bis 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

Weitere .htaccess-Tipps: Htaccess-Datei-Tutorial und Tipps.

index.php

Diese Datei enthält einfachen PHP-Code, der reguläre Ausdrücke verwendet, um den Wert der Subdomain zu überprüfen.

<?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>

Kein Subdomain-Ordner

Wenn Sie das Stammverzeichnis (htdocs / public_html) als Projektverzeichnis verwenden, verwenden Sie die folgende .htaccess-Datei.

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-Host
quelle