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
.org
dominio redirija al.net
dominio 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... .org
a `.net)
Esto supone que solo tiene TLD de un solo nivel, como se menciona en su código (por ejemplo, .net
, .me
, .info
, .org
etc.) 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_HOST
ennombre de host(subdominio + dominio) y eltldsolo. Y guárdelos en dos variables de entorno: HOSTNAME
y TLD
respectivamente.
Luego probamos la TLD
var env y la cambiamos si es necesario (es decir, org
a 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 L
bandera por si acaso.