Erstellen Sie Subdomains on the fly mit .htaccess (PHP)
-
06-09-2019 - |
Frage
Ich suche ein System zu schaffen, die auf die Registrierung wird eine Sub-Domain auf meiner Website erstellen für die Nutzer Fläche ausmachen.
z. johndoe.website.com
ich glaube, es hat etwas mit der .htaccess-Datei zu tun sei und möglicherweise auf der Website an einem anderen Ort umgeleitet? Ich weiß nicht wirklich wissen. Aber alle Informationen, um mich beginnen würde sehr geschätzt werden.
Erstellen Bereich ein Zeichen nach oben ist nicht das Problem - ich habe getan, um diese des Öfteren. Ich bin nur nicht sicher, wo man mit der Sub-Domäne zu starten.
Lösung
Der schnelle Überblick
- Sie benötigen eine Wildcard-Domain auf Ihrem DNS-Server erstellen * .website.com
- Dann in Ihrem vhost Behälter müssen Sie auch das Wildcard angeben * .website.com - Dies ist in der
ServerAlias
DOCs - Dann extrahieren und die Sub-Domain in PHP und zeigt die entsprechenden Daten überprüfen
Die lange Version
1. Erstellen Sie ein Wildcard-DNS-Eintrag
In der DNS-Einstellungen müssen Sie wie *.example.org
ein Wildcard-Domain-Eintrag erstellen. Ein Wildcard-Eintrag sieht wie folgt aus:
*.example.org. 3600 A 127.0.0.1
2. Fügen Sie den Platzhalter in vhost
Als nächstes in der Apache-Konfiguration benötigen Sie einen vhost Container einrichten, die die Platzhalter in der ServerAlias
DOCs Richtlinie. Ein Beispiel vHost Behälter:
<VirtualHost *:80>
ServerName server.example.org
ServerAlias *.example.org
UseCanonicalName Off
</VirtualHost>
3. Auszuarbeiten, die Sub-Domain Sie in PHP sind
Dann in Ihrer PHP-Skripte können Sie die Domäne, indem Sie in dem $_SERVER
Super globales Variable erfahren. Hier ist ein Beispiel für die Sub-Domain in PHP Grabbing:
preg_match('/([^.]+)\.example\.org/', $_SERVER['SERVER_NAME'], $matches);
if(isset($matches[1])) {
$subdomain = $matches[1];
}
ich Regex hier verwendet haben, für Menschen Schlagen Sie Ihre Website über www.subdomain.example.org oder subdomain.example.org zu ermöglichen.
Wenn Sie noch nie mit antizipieren mit www beschäftigen. (Oder ein andere Sub-Domains), dann können Sie einfach einen Teil verwenden wie folgt:
$subdomain = substr(
$_SERVER['SERVER_NAME'], 0,
strpos($_SERVER['SERVER_NAME'], '.')
);
Massen Virtual Hosting
Massen virtuelles Hosting ist eine etwas andere Regelung auf die oben in, dass Sie es in der Regel viele verschiedene Websites verwenden würden eher hosten, als zu versuchen, es zu verwenden, um eine Anwendung als Energie als die Frage schlägt.
Ich habe meine mod_rewrite basierten Massen-Virtual-Hosting-Umgebung, bevor sie in einem Post dokumentiert auf meinem Blog , die Sie aussehen könnte, wenn das ist die Route, die Sie nehmen möchten. Es gibt natürlich auch, die entsprechende Apache-Handbuch Seite .
Apache hat auch einen internen Weg mit Massen-Virtual-Hosting zu tun, das etwas weniger flexibel als die mod_rewrite Methode ist die ich verwendet habe. Dies alles wird beschrieben auf der Apache dynamisch konfiguriert Massen Virtuelle Hosting Handbuch Seite .
Andere Tipps
Sie können jeder Sub-Domain in erster Linie ermöglichen, und dann prüfen, ob die Sub-Domain gültig ist. Zum Beispiel:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^[^.]+\.example\.com$
RewriteRule !^index\.php$ index.php [L]
Im Inneren des index.php
können Sie als die Sub-Domain extrahieren mit:
if (preg_match('/^([^.]+)\.example\.com$/', $_SERVER['HTTP_HOST'], $match)) {
var_dump($match[1]);
}
Aber all dies setzt voraus, dass der Webserver jeden Sub-Domain Namen akzeptiert.
Neben einer DNS Wildcard einrichten, Sie vielleicht einen Blick auf Dynamische Massen Virtual Hosting für Apache die ist, wie ich dies in der Vergangenheit gelöst haben
Der einfachste Weg ist es, alle Sub-Domains zu umleiten (mit Wildcard *), um Ihre / wwwroot zu zeigen. setzen .htaccess in diesen Ordner dann mit dem folgenden Code:
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]
Dies wird erreichen, dass jeder Unterordner des / wwwroot Ordner in akzeptablen über Sub-Domain (foldername.domain.com).
diese Jahre alt Gefunden auf http://www.webmasterworld.com/apache/3163397.htm
Ich fand es einfacher ist es mit PHP zu tun. In der Tat ist eine Sub-Domain innerhalb cPanel erstellen und erstellen Sie Ihre Ordner unter dem gewünschten Domain-Namen. Wie Sie es von Hand in cPanel werden tun, aber alles ist in Millisekunden durch eine einfache PHP-Funktion. 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";
}
Es ist nichts mit .htaccess zu tun. Sie müssen DNS-Einträge und virtuelles Hosting für die Subdomains einzurichten.
mod_vhost_alias ist das richtige Modul, dies zu tun.
Mit einer Zeile Sie Apache sagen können, 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 sagen, das Dokument root / http / users / s / u / Sub-Domain zu setzen, wenn für subdomain.yourdomain.com
angefordertIch denke, der Wildcard-DNS mit Apache Dynamic Massen Virtual Hosting auch eine vernünftige Lösung ist. Obwohl, ich habe es nie versucht.
Wenn Sie das Bedürfnis haben, auf mehrere Server zu skalieren oder die anderen Lösungen funktionieren einfach nicht für Sie, empfehle ich eine Datenbank gefahrene DNS-Server verwenden. Ich habe erfolgreich MyDNS in der Vergangenheit verwendet. Da es verwendet MySQL (oder PostgreSQL) können Sie Ihre DNS on the fly mit PHP aktualisieren oder einfach nur über etwas anderes. Der Code sieht nicht wie es in einer Weile wurde aktualisiert, aber es ist DNS und daher nicht genau Schnitte.
Wildcard Subdomainerstellung Methoden
Als erstes müssen Sie die DNS-Einstellungen mit Ihrem Server DNS-Editor erstellen.
-
Erstellen
A
Datensatz in DNS-Einstellungen mit Host*
Wild Card in Server-IP-Adresse.* 1400 IN A ip_address
-
Erstellen Sie erneut einen
A
Datensatz in DNS-Einstellungen mit Host@
oderdomain_name.tld
in Server-IP-Adresse. TLD bedeutet Top Level Domains oder die Erweiterung der Bereiche wie .com, .org, etc ....@ 1400 IN A ip_address
oderdomain_name.tld 1400 IN A ip_address
-
Erstellen
CNAME
Datensatz wie:www 1400 IN A domainname.tld
- Erstellen Sie die Sub-Domain mit
*
Wildcard wie*.domain.tld
-
Erstellen Sie .htaccess in Ihrem Sub-Domain-Verzeichnis von
*.domain.tld
und setzen 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 Sub-Domain wie
example.domainname.tld
Wenn Sie nicht interessieren, die Daten als Parameter zu übergeben, die .htaccess verwenden, können Sie auch die Daten erhalten, indem folgende Codierung verwenden:
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 Ihre globale Variable an jedem Ort wie global $get_data
verwenden.
echo $get_data->data; //example
(beachten Sie:.. Diese Klasse vor allem für die genaue SUBDOMAINNAME von http_host
bekommen, weil einige zusätzlichen Namen kombinierten vor Ihrer Sub-Domain auch anwendbar wie www.example.domainname.tld
Diese Rückkehr $_GET['data']='wwww'
So ist mein Vorschlag, die $_SERVER['http_host']
zu verwenden, um die genauen Werte zu erhalten statt mit den $_SERVER['query_string']
oder weitergegeben .htaccess Parametern in Ihrer Index-Seite)
Die Ausführung dieses Wildcard Sub-Domains verwendet N Sekunden in TTL 6.Geschwindigkeit up -. DNS-Einstellungen
7.Prüfen die Sub-Domain nach dem angegebenen ttl Zeit (600-10 Minuten) wie => http://abc.domain.tld
(Anmerkung:. Wildcard Subdomains nicht bestanden Subdomains überschreiben, da erste Priorität immer für Ihre bestanden Subdomains)