Eu uso esta configuração no Apache2 para subdomínio curinga e funciona bem:
<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
Isso significa um pedido de "http://sub.abc.net" irá buscar o documentroot "/var/www/domains/sub.abc.net/httpdocs" e solicitar "http://sub.xyz.org" irá buscar o documentroot "/var/www/domains/sub.xyz.org/httpdocs".
Mas quero que a solicitação para *.abc.net seja reescrita para *.xyz.org documentroot.
Responder1
Precisamos que qualquer
.org
domínio redirecione para.net
o domínio documentroot
Presumo que você queira dizer "reescrever", em vez de"redirecionamento" externo, como o código na sua pergunta? (Você também inverteu a direção da reescrita necessária, conforme indicado na sua pergunta, mas, de qualquer forma, seguirei o que você declarou nos comentários... .org
para `.net)
Isso pressupõe que você tenha apenas TLDs de nível único, conforme referenciado em seu código (por exemplo, .net
, .me
, .info
, .org
, etc) e não "TLDs" de vários níveis, 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
Tente algo como o seguinte:
# 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]
O primeiro bloco de directivas inverte as suas condições actuais. ou seja. Diz que se a solicitação for para qualquer um desses "domínios", pare o processamento, em vez de ... apenas reescreva quando a solicitação for concluídanãocorresponder a qualquer um "desses domínios". Isso torna as regras a seguir mais simples, pois agora sabemos que o host solicitado é aquele que queremos reescrever, portanto não precisamos sobrecarregar o código com mais condições.
Em seguida, dividimos o solicitado HTTP_HOST
emnome de anfitrião(subdomínio + domínio) e otldapenas. E armazene-os em duas variáveis de ambiente: HOSTNAME
e TLD
respectivamente.
Em seguida, testamos o TLD
env var e alteramos isso se necessário (ou seja, org
para net
).
E, por último, há uma reescrita incondicional na raiz e no subdiretório apropriados do documento (usando os env vars atribuídos acima), como no seu código. Observe que você declarou apenas "raiz do documento" em sua descrição, mas seu código também inclui um subdiretório com o mesmo nome, por isso incluí o subdiretório também.
Isso pressupõe que as diretivas mod_rewrite indicadas na sua pergunta estejam completas. ou seja. Não há outras diretivas dependentes mais abaixo na configuração? Eu adicionei a L
bandeira para garantir.