Faz algum tempo desde que eu escrevi um RewriteRule, mas aqui está o meu raciocínio:
RewriteEngine on
RewriteCond %{HTTP_HOST} (.+\.)?old\.com$ [NC]
RewriteRule (.*) http://%1new.com$1 [R]
Coloque isso em um virtualhost baseado em nome para old.com. Aqui está o processo de pensamento, para que você possa ter uma chance de corrigi-lo por conta própria se eu estiver um pouco enferrujado:
RewriteCond
breakdown:
-
RewriteCond
corresponde a todos os hosts de entrada para um prefixo de "um ou mais caracteres seguidos por um ponto literal", seguido por old.com. O ponto está dentro dos parênteses porque não estará presente a menos que um componente subdomínio seja fornecido. - As barras invertidas devem escapar do significado dos pontos. (torná-los literais)
- O
?
especifica que tudo o que está nos parênteses é opcional. (o componente subdomínio) - O caractere
$
ancora o regex no final da string, para evitar estranhezas precisas de correspondência. - O sinalizador
[NC]
faz com que seja insensível a maiúsculas e minúsculas. - Como o virtualhost garantirá que cada string contenha um padrão correspondente, essa correspondência por si só não fará nada. O importante é que os parênteses capturem o componente subdomínio do cabeçalho do host recebido para o próximo
RewriteRule
.
RewriteRule
breakdown:
- Capture todo o URI da solicitação recebida com
(.*)
. - Ignorando, o sinal
[R]
especifica uma ação de redirecionamento. - O URL de redirecionamento tem duas substituições:
-
- O primeiro é
%1
, que é a primeira string capturada porRewriteCond
. Nesse caso, deve ser o sufixo de domínio. A falta de um ponto prefixado antes de new.com é importante: pode não haver um componente de subdomínio, caso em que não deve haver nenhum ponto. O ponto deveria ter sido capturado como parte da regex RewriteCond.
- O primeiro é
-
- O segundo é
$1
, que corresponde à primeira string capturada porRewriteRule
. Este deve ser o URI que o usuário estava tentando acessar no subdomínio.
- O segundo é
Se alguém apontar uma solução para isso que evite o uso de RewriteRule, faça o favor deles: você deve preferir isso como sua solução sempre que possível. mod_rewrite
é para quando você não tem uma solução mais elegante fornecida por diretivas de configuração dedicadas.
Também devo observar que este exemplo fará apenas o redirecionamento não-HTTPS e não leva em consideração se o servidor da Web está usando uma porta alternativa. Você pode precisar ajustar isso ainda mais para necessidades especiais como essas, mas é um ponto de partida.