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.

puk
fonte
1
Por favor, consulte stackoverflow.com/questions/9153262/…, onde discuto alguns dos truques padrão.
TerryE
possível duplicado de Como depurar o script de reescrita do htaccess
usuário

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
Ben
fonte
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

Tobias Schultze
fonte
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.

Kaz
fonte
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.

Andy
fonte
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

Fluxo
fonte
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