O Apache reescreve várias condições

9

Eu tenho um site que foi migrado de um nome de domínio antigo (por exemplo, olddomain.com) para um novo nome de domínio (por exemplo, newdomain.com).

Por motivos de SEO, preciso reescrever todo o tráfego do site no novo nome de domínio principal (por exemplo, www.newdomain.com). Infelizmente, não sei como adicionar várias condições de reescrita do tipo OR. Parece que, com todas as condições, código de exemplo abaixo, recebo uma condição AND.

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName newdomain.com
        ServerAlias www.newdomain.com
        ServerAlias olddomain.com
        ServerAlias www.olddomain.com
        DocumentRoot /var/www/newdomain.com/www/
        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>

        ErrorLog /var/log/apache2/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        RewriteEngine on
        RewriteCond %{HTTP_HOST} ^olddomain.com [NC]
        RewriteCond %{HTTP_HOST} ^www.olddomain.com [NC]
        RewriteCond %{HTTP_HOST} ^newdomain.com [NC]
        RewriteRule ^/(.*)$ http://www.newdomain.com/$1 [R=301,NC]

        CustomLog /var/log/apache2/access.log combined
</VirtualHost>

Alguém pode me dar uma ajudinha? Qualquer ajuda seria muito apreciada.

gurun8
fonte

Respostas:

16

Apesar de você já ter encontrado a solução para o seu trabalho, eu ainda a publicarei, pois a sua está longe de ser ótima.

Solução # 1 : Substituir [NC]por [NC,OR]em 2 primeiras linhas rewritecond do código original. Por padrão, um RewriteCond vinculado a outro RewriteCond por lógica AND. Isso instruirá o Apache a usar a ORlógica:

RewriteCond %{HTTP_HOST} ^olddomain.com [NC,OR]
RewriteCond %{HTTP_HOST} ^www.olddomain.com [NC,OR]
RewriteCond %{HTTP_HOST} ^newdomain.com [NC]
RewriteRule ^/(.*)$ http://www.newdomain.com/$1 [R=301,L,NC]

Solução 2 : como você tem apenas 4 nomes de domínio no total, será muito mais fácil usar a abordagem oposta - redirecione de QUALQUER domínio, exceto o correto:

RewriteCond %{HTTP_HOST} !^www.newdomain.com [NC]
RewriteRule ^/(.*)$ http://www.newdomain.com/$1 [R=301,L,NC]
LazyOne
fonte
A solução 2 é a melhor, mas se você tiver www.newdomain.come test.newdomain.comou algo assim, pode ser melhor comparar !newdomain.com$desde que o domínio antigo não termine em "newdomain.com" como "thisisanoldnewdomain.com". Mais exatamente com o item 1, não consigo encontrar [OU] documentado em nenhum lugar. Isso realmente funciona?
DerfK 22/07
@DerfK docs - você precisa rolar um pouco: "'ornext | OR' (ou próxima condição) Use isso para combinar condições de regra com um OR local em vez do AND implícito."
LazyOne
1

Acabei de encontrar esta citação:

rewriteConds se aplicam apenas ao único rewriteRule que os segue.

aqui: http://www.webmasterworld.com/apache/3350200.htm

Aqui está a solução para mim:

    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^olddomain.com [NC]
    RewriteRule ^/(.*)$ http://www.newdomain.com/$1 [R=301,NC]

    RewriteCond %{HTTP_HOST} ^www.olddomain.com [NC]
    RewriteRule ^/(.*)$ http://www.newdomain.com/$1 [R=301,NC]

    RewriteCond %{HTTP_HOST} ^newdomain.com [NC]
    RewriteRule ^/(.*)$ http://www.newdomain.com/$1 [R=301,NC]
gurun8
fonte
1
Como uma observação para qualquer pessoa que visite aqui anos depois, a solução proposta pelo LazyOne acima (e aceita pelo OP) é ​​muito mais otimizada, especialmente se você tiver mais do que apenas duas ou três condições ORjuntas.
Doktor J