Curinga na reconfiguração do DocumentRoot para virtualhost

1

Eu uso essa configuração no apache2 para o subdomínio de caractere 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 que uma solicitação para " link " buscará o documentroot "/var/www/domains/sub.abc.net/httpdocs "& O pedido de " link " irá buscar o documentroot "/var/www/domains/sub.xyz.org/httpdocs".

Mas eu quero que o pedido para * .abc.net seja reescrito para documentarot * .xyz.org.

    
por Pankaj Gupta 28.02.2018 / 15:13

1 resposta

0

We need any .org domain should redirect to .net domain documentroot

Eu suponho que você quer dizer "reescrever", ao contrário de "redirecionamento" externo , como o código da sua pergunta? (Você também inverteu a direção da reescrita requerida, conforme declarado na sua pergunta, mas, de qualquer forma, vou com o que você declarou nos comentários ... .org para '.net)

Isso pressupõe que você tenha somente TLDs de nível único, conforme mencionado em seu código (por exemplo, .net , .me , .info , .org , etc) e não "DPNs" 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 diretivas reverte suas condições atuais. ie. Ele 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 não não corresponde a nenhum desses "domínios". Isso torna as regras a seguir mais simples, já que agora sabemos que o host solicitado é aquele que queremos reescrever, portanto, não precisamos colocar o código com mais condições.

Em seguida, dividimos o HTTP_HOST solicitado no hostname (subdomínio + domínio) e o tld apenas. 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 to net ).

E, por último, há uma reconfiguração incondicional para o subdiretório e a raiz do documento apropriado (usando o env vars atribuído acima), como em seu código. Note que você declarou apenas "document root" em sua descrição, mas seu código também inclui um subdiretório com o mesmo nome, então incluímos o subdiretório também.

Isto assume que as diretivas mod_rewrite declaradas em sua pergunta estão completas. ie. Não há outras diretivas dependentes mais abaixo na configuração? Eu adicionei o sinalizador L para uma boa medida.

    
por 28.02.2018 / 23:53