Ich verwende diese Konfiguration in Apache2 für Wildcard-Subdomains und sie funktioniert gut:
<VirtualHost _default_:80>
UseCanonicalName off
Options FollowSymLinks
VirtualDocumentRoot /var/www/domains/%0/httpdocs
RewriteEngine On
RewriteCond %{HTTP_HOST} ^\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b
RewriteRule ^(.+) /var/www/domains/localhost/httpdocs/$1 [L]
RewriteCond %{HTTP_HOST} !^[^.]+\.abc\.net [NC]
RewriteCond %{HTTP_HOST} !^[^.]+\.example\.me [NC]
RewriteCond %{HTTP_HOST} !^[^.]+\.mysite\.info [NC]
RewriteCond %{HTTP_HOST} !^[^.]+\.xyz\.org [NC]
RewriteCond %{HTTP_HOST} !\.internal$ [NC]
RewriteCond %{REQUEST_URI} !^/collateral/ [NC]
RewriteRule ^(.+) /var/www/domains/%{HTTP_HOST}/httpdocs/%{HTTP_HOST}/$1
ErrorDocument 403 /error/404.php
Dies bedeutet eine Anfrage für „http://sub.abc.net" holt das Dokumentstammverzeichnis "/var/www/domains/sub.abc.net/httpdocs" und fordert "http://sub.xyz.org" holt das Dokumentstammverzeichnis "/var/www/domains/sub.xyz.org/httpdocs".
Ich möchte jedoch, dass die Anforderung an *.abc.net in das Dokumentstammverzeichnis *.xyz.org umgeschrieben wird.
Antwort1
Wir benötigen
.org
eine Weiterleitung jeder Domäne zum.net
Domänen-Documentroot.
Ich nehme an, Sie meinen "umschreiben" und nichtexterne "Weiterleitung", wie der Code in Ihrer Frage? (Sie haben auch die Richtung der erforderlichen Umschreibung umgekehrt, wie in Ihrer Frage angegeben, aber ich werde mich trotzdem an das halten, was Sie in den Kommentaren angegeben haben ... .org
zu `.net)
Dies setzt voraus, dass Sie nur einstufige TLDs haben, wie in Ihrem Code referenziert (z. B. .net
, .me
, .info
, .org
, usw.) und keine mehrstufigen „TLDs“ wie .co.uk
.
RewriteCond %{HTTP_HOST} !^[^.]+\.abc\.net [NC] RewriteCond %{HTTP_HOST} !^[^.]+\.example\.me [NC] RewriteCond %{HTTP_HOST} !^[^.]+\.mysite\.info [NC] RewriteCond %{HTTP_HOST} !^[^.]+\.xyz\.org [NC] RewriteCond %{HTTP_HOST} !\.internal$ [NC] RewriteCond %{REQUEST_URI} !^/collateral/ [NC] RewriteRule ^(.+) /var/www/domains/%{HTTP_HOST}/httpdocs/%{HTTP_HOST}/$1
Versuchen Sie stattdessen etwas wie das Folgende:
# If any of these domains are requested then stop
RewriteCond %{HTTP_HOST} ^[^.]+\.abc\.net [NC,OR]
RewriteCond %{HTTP_HOST} ^[^.]+\.example\.me [NC,OR]
RewriteCond %{HTTP_HOST} ^[^.]+\.mysite\.info [NC,OR]
RewriteCond %{HTTP_HOST} ^[^.]+\.xyz\.org [NC,OR]
RewriteCond %{HTTP_HOST} \.internal$ [NC,OR]
RewriteCond %{REQUEST_URI} ^/collateral/ [NC]
RewriteRule ^ - [L]
# Split the requested host into HOSTNAME + TLD (env vars)
RewriteCond %{HTTP_HOST} ^([^.]+\.[^.]+)\.([^.]+)
RewriteRule ^ - [E=HOSTNAME:%1,E=TLD:%2]
# Change TLD "org" to "net"
RewriteCond %{ENV:TLD} =org [NC]
RewriteRule ^ - [E=TLD:net]
RewriteRule (.+) /var/www/domains/%{ENV:HOSTNAME}.%{ENV:TLD}/httpdocs/%{ENV:HOSTNAME}.%{ENV:TLD}/$1 [L]
Der erste Block von Anweisungen kehrt Ihre aktuellen Bedingungen um. D. h., er besagt, wenn die Anfrage für eine dieser „Domänen“ ist, dann die Verarbeitung beenden, anstatt... nur neu schreiben, wenn die Anfragenichtmit einer dieser „Domänen“ übereinstimmen. Dadurch werden die folgenden Regeln einfacher, da wir nun wissen, dass der angeforderte Host einer ist, den wir umschreiben möchten, sodass wir den Code nicht mit weiteren Bedingungen überladen müssen.
Anschließend teilen wir die angefragten Daten HTTP_HOST
in dieHostname(Subdomäne + Domäne) und dietldnur. Und speichern Sie diese in zwei Umgebungsvariablen: HOSTNAME
bzw. TLD
.
Anschließend testen wir die TLD
Umgebungsvariable und ändern diese bei Bedarf (z. B. org
in net
).
Und schließlich erfolgt eine unbedingte Umschreibung des entsprechenden Dokumentstammverzeichnisses und -unterverzeichnisses (unter Verwendung der oben zugewiesenen Umgebungsvariablen), wie in Ihrem Code. Beachten Sie, dass Sie in Ihrer Beschreibung nur „Dokumentstammverzeichnis“ angegeben haben, Ihr Code jedoch auch ein gleichnamiges Unterverzeichnis enthält, sodass ich das Unterverzeichnis ebenfalls eingeschlossen habe.
Dies setzt voraus, dass die in Ihrer Frage angegebenen Mod_rewrite-Direktiven vollständig sind. D. h., es gibt keine anderen abhängigen Direktiven weiter unten in der Konfiguration? Ich habe das L
Flag sicherheitshalber hinzugefügt.