Como depurar o Apache mod_rewrite


171

Eu tenho dois problemas principais com o mod_rewrite:

1) Não há nenhum erro significativo relatado quando tenho uma regra inválida

insira a descrição da imagem aqui

2) Para testar cada modificação de maneira confiável, preciso apagar o cache do chrome. Isso não é ciência do foguete, mas eu tenho que pressionar Ctrl + Shift + Delete, clique em OK, feche a janela e recarregue.

Gostaria de ver se algum dos gurus está disposto a compartilhar seus segredos para gerenciar com eficiência o código mod_rewrite.


1
Por favor, consulte stackoverflow.com/questions/9153262/…, onde discuto alguns dos truques padrão.
TerryE

Respostas:


283

Um truque é ativar o log de reescrita. Para ativá-lo, tente estas linhas na configuração principal do apache ou no arquivo host virtual atual ( não no .htaccess):

RewriteEngine On
RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3

Desde o Apache httpd 2.4, as diretivas RewriteLog e RewriteLogLevel mod_rewrite foram completamente substituídas pela nova configuração de log por módulo.

LogLevel alert rewrite:trace6

81
Você não pode colocar isso em .htaccess. Você precisa colocá-lo na configuração do VirtualHost.
Attila Szeremi 14/03

7
Você também deve ter a RewriteEngine Onseção porque, se você a habilitar (como eu fiz) no .htaccessarquivo, nada será registrado.
chacham15

12
onde está o arquivo de log localizado no apache 2.4?
Charles John Thompson III

4
Você encontrará os itens de log 2.4 no log de erros relevante. Isto pode depender de sua configuração, mas o padrão Debian / Ubuntu configurações de tê-los em /var/log/apache2/error.log
Josiah

10
Dica profissional: lembre-se de desativar o log de reescrita. Se você esquecer, enche seu disco rígido com bastante rapidez, principalmente em um servidor de produção.
John Hunt

132

A diretiva LogRewrite, como mencionada por Ben, não está mais disponível no Apache 2.4. Você precisa usar a diretiva LogLevel. Por exemplo

LogLevel alert rewrite:trace6

Consulte http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#logging


22
onde está o arquivo de log associado a isso?
Charles John Thompson III

8
@CharlesJohnThompsonIII - O arquivo de log é o log de erros (especificado pela diretiva ErrorLog). Por docs, você pode obter apenas as mensagens de reescrita com o grep:tail -f error_log|fgrep '[rewrite:'
billynoah

1
não se esqueça de reiniciar o apache #
Accountant # 29/16

1
Eu tinha que ter certeza de que AllowOverrideestava pronto All!
Michael Michael

25

Para resolução básica de URL, use um buscador de linha de comando como wgetou curlpara fazer o teste, em vez de um navegador manual. Então você não precisa limpar nenhum cache; basta subir a seta e entrar em um shell para executar novamente as buscas de teste.


14
Outro truque é usar o "Modo pornô" do Chrome (Ctl + Shift + N). Quando você fecha a janela, qualquer contexto de sessão em cache é descartado.
TerryE

Eu acho que a "sessão privada" do Firefox também está navegando. Mas você está dizendo isso neste contexto é por janela indivíduo (assim você não está fechando Chrome?)
Kaz

2
AFAIK, Chrome e Ff são diferentes, pois o Ff é executado como um processo único que está no modo privado ou não. Com o Chrome, cada guia ou janela é executada como um processo separado e pode ser individualmente em modo privado; feche uma janela / guia privada e seu contexto será lixeira.
TerryE

1
O addon PrivateTab para FF faz a coisa. Cada guia funciona individualmente.
Javid

Este método também mostra redirecionamentos! Agradável para alguém que não tem acesso ao arquivo de configuração do apache da máquina.
Geof Sawaya

14

Existe o testador de htaccess .

Ele mostra quais condições foram testadas para um determinado URL, quais atenderam aos critérios e quais regras foram executadas.

Parece ter algumas falhas, no entanto.


2
Para mim, mostrou uma regra executada em verde na última linha sem nenhum código.
21415 Andy As

@ thombr você pode ser mais preciso, por favor? O link não funciona? Ou a ferramenta? O que exatamente não funciona? E por que isso é relevante no contexto desta questão?
Andy

1
Isso me diz que a URL está sendo transformada como esperado ... no entanto no servidor real que eu estou recebendo um 404
Michael

@michael é a regra testada a única presente na sua configuração? O mod_rewrite está realmente instalado e ativo?
Andy

Acontece que as substituições não foram habilitados
Michael

3

Baseado na resposta de Ben você pode fazer o seguinte ao executar o apache no Linux (Debian no meu caso).

Primeiro, crie o arquivo rewrite-log.load

/etc/apache2/mods-availabe/rewrite-log.load

RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3

Então entre

$ a2enmod rewrite-log

Seguido por

$ service apache2 restart

E quando você terminar de depurar suas regras de reescrita

$ a2dismod rewrite-log && service apache2 restart


Isso não funcionou. Recebo sandino @ inveja: ~ $ sudo service apache2 restart * Reiniciando o servidor web apache2 [falha] * O apache2 configtest falhou. A saída do teste de configuração foi: AH00526: Erro de sintaxe na linha 1 de /etc/apache2/mods-enabled/rewrite-log.load: Comando inválido 'RewriteLog', talvez com erro de ortografia ou definido por um módulo não incluído na configuração do servidor
sandino

3
@ Sandino, qual versão do Apache você está executando? Parece que esta sintaxe foi alterado para 2,4, em vez disso usar: LogLevel warn rewrite:trace8ou LogLevel info rewrite:trace8onde 8 pode ser qualquer número 1-8
insaner
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.