Como resolvo por que minhas regras de reescrita não estão sendo aplicadas pelo Apache?

StackOverflow https://stackoverflow.com/questions/215316

  •  03-07-2019
  •  | 
  •  

Pergunta

Eu tenho um aplicativo da web Tomcat 6 em execução com Apache httpd como front-end.Estou usando mod_proxy e mod_proxy_ajp para encaminhar as solicitações ao Tomcat.Meu servidor está rodando o Ubuntu.Agora estou tentando usar o mod_rewrite para remover o www inicial, para que o URL canônico do meu site seja http://domínio.com em vez de http://www.domínio.com

Eu li vários tutoriais sobre como usar o mod_rewrite, mas não consigo fazer nenhuma reescrita funcionar.Tentei colocar a regra de reescrita em um arquivo .htaccess (depois de modificar meu arquivo /etc/apache/sites-available/default para definir AllowOverride all).Tentei colocar a regra de reescrita em Apache2.conf, httpd.conf e rewrite.conf.Eu tentei tudo isso com o registro de reescrita ativado.O arquivo de log é criado, mas o Apache não gravou nada nele.Achei que talvez o mod_proxy estivesse de alguma forma impedindo o uso das regras de reescrita, então tentei desabilitar isso também ... e ainda não consigo reescrever e nada no log.

Neste ponto, não tenho absolutamente nenhuma ideia do que tentar a seguir.Como posso solucionar o motivo pelo qual o Apache não está usando minhas regras de reescrita?

Para referência, aqui estão minhas diretivas de reescrita:

<IfModule mod_rewrite.c>

    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www.domain.com$ [NC]
    RewriteRule ^(.*)$ http://domain.com/$1 [R=301,L]
    RewriteLog "/var/log/apache2/rewrite.log"
    RewriteLogLevel 3

</IfModule>

Editar:as respostas abaixo são úteis para o meu caso específico, mas provavelmente não tão úteis para a comunidade em geral quanto as respostas sobre como solucionar problemas de diretivas do Apache em geral.Por exemplo, existe uma maneira de ativar o log até o ponto em que ele me diga quais diretivas estão sendo aplicadas e em que ordem a solicitação chega?

Editar 2:Eu fiz as coisas funcionarem agora.Meus hosts virtuais não estavam configurados corretamente e eu também não tinha o regex de reescrita correto.Aqui estão as diretrizes finais de reescrita que comecei a trabalhar:

<IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{HTTP_HOST} ^www\.domain\.com [NC]
        RewriteRule ^(.*)$ http://domain.com$1 [L,R=301]
</IfModule>
Foi útil?

Solução

Tentando responder sua pergunta:Para depurar a operação do Apache você pode ajustar o Nível de registro para um nível inferior (talvez debug).Mas mesmo se você colocar debug se você desabilitar o Log do módulo em questão, não receberá nenhuma mensagem dele.Por exemplo, o padrão [RequestLogLevel][2] é 0, por exemplo, o módulo não escreve nenhuma mensagem.Vejo que você configurou para 3, mas tipo RoBorg disse mudar para 9 isso talvez seja muito baixo para o seu caso.

Tentando resolver seu problema:Tente mudar a maneira como você reescreve o nome do host usando a forma inversa - veja se o nome do host é o que você deseja e, se não, altere-o para o nome do host desejado.Como afirmado no Guia de reescrita de URL - Servidor HTTP Apache no site Apache:

Nomes de host canônicos

Descrição:O objetivo desta regra é forçar o uso de um nome de host específico, em preferência a outros nomes de host que podem ser usados ​​para alcançar o mesmo site.Por exemplo, se você deseja forçar o uso de www.example.com em vez de exemplo.com, pode usar uma variante da receita a seguir.Solução:

# To force the use of 
RewriteEngine On
RewriteCond %{HTTP_HOST}   !^www\.example\.com [NC]
RewriteCond %{HTTP_HOST}   !^$
RewriteRule ^/(.*)         http://www.example.com/$1 [L,R]

No exemplo deles, eles mudam de example.com para www.example.com mas você entendeu.Basta ajustá-lo para o seu caso.

Outras dicas

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

</IfModule>

Teve o mesmo problema com meu servidor, mas isso funcionou

Tente aumentar o nível de registro até 9 (o máximo).
Certifique -se de que o Apache tenha os direitos adequados para o arquivo de log (embora, se ele o criou, parece que também pode escrever para ele).
Tente uma regra de reescrita diferente, sem condição, por exemplo RewriteRule .* www.google.com [RL]

Em que contexto essas regras são colocadas? Você pode colocá -los em um host virtual diferente, por exemplo. Tente colocá -los fora de qualquer contêiner se tiver apenas um domínio para testar.

De qualquer forma, há uma alternativa para alcançar 'sem www', consiste em usar dois hosts virtuais, um para www e outro para 'nowww'. www um redireciona para o outro:

<VirtualHost *:80>
    ServerName www.domain.com
    Redirect permanent / http://domain.com
</VirtualHost>


<VirtualHost *:80>
    ServerName domain.com
    #The rest of the configuration (proxying, etc.)
</VirtualHost>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top