Comodín en la reescritura de DocumentRoot para virtualhost

Comodín en la reescritura de DocumentRoot para virtualhost

Utilizo esta configuración en Apache2 para el subdominio comodín y funciona bien:

 <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

Esto significa una solicitud de "http://sub.abc.net" buscará la raíz del documento "/var/www/domains/sub.abc.net/httpdocs" y solicitará "http://sub.xyz.org" buscará la raíz del documento "/var/www/domains/sub.xyz.org/httpdocs".

Pero quiero que la solicitud a *.abc.net se reescriba en *.xyz.org documentroot.

Respuesta1

Necesitamos que cualquier .orgdominio redirija al .netdominio documentroot.

Supongo que te refieres a "reescribir", en contraposición a"redireccionamiento" externo, ¿Te gusta el código de tu pregunta? (También invirtió la dirección de la reescritura requerida, como se indica en su pregunta, pero de todos modos, seguiré lo que indicó en los comentarios... .orga `.net)

Esto supone que solo tiene TLD de un solo nivel, como se menciona en su código (por ejemplo, .net, .me, .info, .orgetc.) y no "TLD" de varios niveles como .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

Pruebe algo como lo siguiente en su lugar:

# 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]

El primer bloque de directivas revierte sus condiciones actuales. es decir. Dice que si la solicitud es para cualquiera de "estos dominios", entonces deje de procesar, en lugar de... solo vuelva a escribir cuando la solicitud lo haga.nocoincida con cualquiera de "estos dominios". Esto simplifica las siguientes reglas, ya que ahora sabemos que el host solicitado es uno que queremos reescribir, por lo que no necesitamos llenar el código con más condiciones.

Luego dividimos lo solicitado HTTP_HOSTennombre de host(subdominio + dominio) y eltldsolo. Y guárdelos en dos variables de entorno: HOSTNAMEy TLDrespectivamente.

Luego probamos la TLDvar env y la cambiamos si es necesario (es decir, orga net).

Y, por último, hay una reescritura incondicional en la raíz y el subdirectorio del documento apropiado (usando las variables env asignadas anteriormente), como en su código. Tenga en cuenta que solo indicó "raíz del documento" en su descripción, pero su código también incluye un subdirectorio con el mismo nombre, por lo que también incluí el subdirectorio.

Esto supone que las directivas mod_rewrite indicadas en su pregunta están completas. es decir. ¿No hay otras directivas dependientes más abajo en la configuración? Agregué la Lbandera por si acaso.

información relacionada