Curinga na reescrita do DocumentRoot para virtualhost

Curinga na reescrita do DocumentRoot para virtualhost

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 .orgdomínio redirecione para .neto 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... .orgpara `.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_HOSTemnome de anfitrião(subdomínio + domínio) e otldapenas. E armazene-os em duas variáveis ​​de ambiente: HOSTNAMEe TLDrespectivamente.

Em seguida, testamos o TLDenv var e alteramos isso se necessário (ou seja, orgpara 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 Lbandeira para garantir.

informação relacionada