Ich möchte, dass Benutzer ihre eigenen Abschnitte innerhalb meiner Website registrieren können und dass diese Abschnitte ihre eigene Subdomain meiner Website sind. So kann jemand 'test' registrieren und 'test.beispiel.com' auf ihre Website verweisen, die sich zum Beispiel unter /site.php?id=1 befindet. Wie würde ich eine Mod-Rewrite-Regel dafür schreiben?
Antworten
Zu viele Anzeigen?mod_rewrite
ist möglicherweise nicht das beste Werkzeug dafür. RewriteRules sind großartig für das Zuordnen einer Datei zu etwas anderem, aber es wurde nicht wirklich für die Domänenzuordnung gedacht.
Das Beste, was Sie mit mod_rewrite
tun können, ist folgendes:
RewriteEngine On
# Überspringe www.domain.com
RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTP_HOST} ^([^.]+)\.domain\.com
RewriteRule ^/(.*)$ site.php?domain=%1&file=$1 [L]
Was wirklich nicht nützlich ist. Was ich stattdessen empfehlen würde, ist den Wert von HTTP_HOST
programmgesteuert zu überprüfen, wie folgt:
function get_subdomain() {
if(preg_match('/^([^.]+)\.domain\.com/i', $_SERVER['HTTP_HOST'], $matches))
return $matches[1];
}
Sie können Apache konfigurieren, um die "speziellen" Domains in der Apache-Konfiguration zu beanspruchen (z. B. www.meinedomain.com usw.) in Ihren virtuellen Host-Containern und die anderen standardmäßig auf Ihren ersten virtuellen Host zu setzen. Sie können dann die Basis-URL zu einer Dispatcher-Anwendung umleiten, die die URL überprüft und den Benutzer zu seinem richtigen Bereich weiterleitet.
Aus den Apache-2.0-Dokumenten:
Fast jede Apache-Direktive kann in einen VirtualHost-Container gestellt werden. Der erste VirtualHost-Bereich wird für Anfragen ohne bekannten Servernamen verwendet.
Fügen Sie den Code hinzu, um *.meinedomain.com im ersten virtuellen Host zu handeln:
Servername custom.meinedomain.com
DocumentRoot /var/www/html/custom
RewriteEngine on
RewriteRule ^/$ /var/www/cgi-bin/dispatch.cgi [R]
# weitere Konfigurationen hier
Servername www.meinedomain.com
DocumentRoot /var/www/html/homepage
# weitere Konfigurationen hier
In dispatch.cgi überprüfen Sie die aufrufende URL, um zu bestimmen, wohin der Benutzer gehen soll. Stellen Sie sicher, dass Sie Ihre DNS so einrichten, dass alle Subdomains akzeptiert werden.
Hoffentlich hilft das!
Wir nutzen diese Technik tatsächlich seit einem Jahr ohne größere Probleme. Unsere mod_rewrite-Konfiguration sieht wie folgt aus:
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !www.meinedomain.com
RewriteCond %{HTTP_HOST} ^([^.]+)\.meinedomain\.com
RewriteCond %{REQUEST_URI} !admin
RewriteRule (.*) /admin/ [R=301,L]
RewriteRule ^admin(.*)$ hosted/admin/$1 [QSA,L]
Was passiert, ist dass Benutzer zu theiraccount.meinedomain.com/admin weitergeleitet werden.
Dann verwenden wir PHP, um den Kontoteil des Domainnamens zu identifizieren. Die Verwendung von etwas wie $_SERVER['SERVER_NAME'] oder einer Methode zum Abrufen des Domainnamens und zum Parsen funktioniert sehr gut.
Behalten Sie diese Konfigurationen jedoch in der httpd.conf bei, da dies bei stark frequentierten Websites zu einem CPU-Problem werden kann, wenn es als .htaccess beibehalten wird.