Platzhalter beim Umschreiben von DocumentRoot für virtuellen Host

Platzhalter beim Umschreiben von DocumentRoot für virtuellen Host

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 .orgeine Weiterleitung jeder Domäne zum .netDomä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 ... .orgzu `.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_HOSTin dieHostname(Subdomäne + Domäne) und dietldnur. Und speichern Sie diese in zwei Umgebungsvariablen: HOSTNAMEbzw. TLD.

Anschließend testen wir die TLDUmgebungsvariable und ändern diese bei Bedarf (z. B. orgin 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 LFlag sicherheitshalber hinzugefügt.

verwandte Informationen