Domínio de redirecionamento do Apache e todos os subdomínios

4

Eu tenho uma configuração do Apache com vários hosts virtuais como subdomínios. Acabei de comprar um novo nome de domínio e quero que todos os pedidos para este nome de domínio redirecionem para o novo, incluindo subdomínios:

old.com > new.com
sub.old.com > sub.new.com

Existe alguma maneira fácil de fazer isso dentro do httpd.conf ?

    
por Oliver Joseph Ash 12.01.2013 / 00:11

1 resposta

5

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 por RewriteCond . 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 segundo é $1 , que corresponde à primeira string capturada por RewriteRule . Este deve ser o URI que o usuário estava tentando acessar no subdomínio.

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.

    
por 12.01.2013 / 07:09