Como depurar .htaccess RewriteRule não está funcionando

115

Eu tenho um RewriteRuleem um .htaccessarquivo que não está fazendo nada. Como faço para solucionar isso?

  • Como posso verificar se o .htaccessarquivo está sendo lido e obedecido pelo Apache? Posso escrever uma mensagem de eco "está funcionando", se eu escrever, onde essa linha seria ecoada?
  • Se o .htaccessarquivo não está sendo usado, como posso fazer o Apache usá-lo?
  • Se o .htaccessestiver sendo usado, mas RewriteRuleainda não estiver fazendo efeito, o que mais posso fazer para depurar?
macha
fonte

Respostas:

144

Insira algum valor de lixo em seu , .htaccess por exemplo foo bar, sakjnaskljdnas qualquer palavra-chave não reconhecida pelo htaccess e visite seu URL. Se estiver funcionando, você deve obter um

500 Erro Interno do Servidor

Erro do Servidor Interno

O servidor encontrou um erro interno ou configuração incorreta e não foi capaz de concluir sua solicitação ....

Eu sugiro que você coloque logo depois RewriteEngine on.


Já que você está em sua máquina. Presumo que você tenha acesso ao .confarquivo apache .

abra o .confarquivo e procure uma linha semelhante a:

LoadModule rewrite_module modules/mod_rewrite.so

Se estiver comentado (#), descomente e reinicie o apache.


Para registrar reescrever

RewriteEngine On
RewriteLog "/path/to/rewrite.log"
RewriteLogLevel 9

Coloque as 3 linhas acima em seu virtualhost. reinicie o httpd.

RewriteLogLevel 9Usar um valor alto para o Nível reduzirá drasticamente a velocidade do seu servidor Apache! Use o arquivo de registro de reescrita em um nível maior que 2 apenas para depuração! O nível 9 registrará quase todos os detalhes de reescrita.


ATUALIZAR

As coisas mudaram no Apache 2.4:

DE Atualizando para 2.4 de 2.2

As diretivas RewriteLog e RewriteLogLevel foram removidas. Esta funcionalidade agora é fornecida configurando o nível apropriado de registro para o módulo mod_rewrite usando a diretiva LogLevel . Veja também a seção de registro mod_rewrite.

Para obter mais informações sobre LogLevel, consulte a diretiva LogLevel

você pode realizar

RewriteLog "/path/to/rewrite.log"

desta maneira agora

LogLevel debug rewrite_module:debug
ThinkingMonkey
fonte
Ok, então o problema é que estou tentando adicionar um reescrito ao arquivo .htaccess e, por algum motivo, ele não está usando.
macha de
@macha tente o método acima. Se você receber um erro interno do servidor, significa que o mod_rewrite (.htaccess) está ativado. Você está em um host compartilhado?
ThinkingMonkey de
Não, estou trabalhando em meu localhost, você tem uma ideia de quando o arquivo .htaccess é carregado? Achei que o Apache leria isso primeiro
macha de
Os arquivos @macha .htaccess nunca carregam. Eles são acessados ​​(se presentes) pelo apache quando você tenta acessar uma página que está presente nessa pasta.
ThinkingMonkey de
ok, minha pergunta era, se alguém solicitar uma página da Web, o apache vai diretamente para os scripts do lado do servidor ou procuraria o arquivo .htaccess naquela pasta e então continuaria ??
macha
52

A resposta 'Digite algum valor de lixo' não funcionou para mim, meu site continuava a carregar, apesar do lixo inserido.

Em vez disso, adicionei a seguinte linha ao início do arquivo .htaccess:

deny from all

Isso irá informá-lo rapidamente se .htaccess está sendo selecionado ou não. Se o .htaccess estiver sendo usado, os arquivos dessa pasta não serão carregados.

Caitriona
fonte
4
Este é o teste mais simples se você não se importar em nada trabalhar por alguns segundos enquanto verifica.
Mordred,
1
Sim - demorei cerca de um segundo para verificar se o site em que estava trabalhando não estava usando arquivos .htaccess.
bonh
1
Obrigado, funciona como um encanto :) me economizou algum tempo depurando!
Martijn van Hoof
32

Geralmente, qualquer alteração no .htaccess deve ter efeitos visíveis. Se não tiver efeito, verifique seus arquivos apache de configuração, algo como:

<Directory ..>
    ...
    AllowOverride None
    ...
</Directory>

Deve ser alterado para

AllowOverride All

E você poderá alterar as diretivas nos arquivos .htaccess.

jgpATs2w
fonte
obrigado. Encontrei a seção relevante no arquivo apache2.conf principal do diretório tree / var / www
Tim Richardson
6

Talvez um método mais lógico seja criar um arquivo (por exemplo, test.html), adicionar algum conteúdo e, em seguida, tentar defini-lo como a página de índice:

DirectoryIndex test.html

Na maior parte, a regra .htaccess irá sobrescrever a configuração do Apache onde trabalha no nível de diretório / arquivo

Cez
fonte
4

Para responder à primeira das três perguntas, uma maneira simples de ver se o arquivo .htaccess está funcionando ou não é acionar um erro personalizado na parte superior do arquivo .htaccess:

ErrorDocument 200 "Hello. This is your .htaccess file talking."
RewriteRule ^ - [L,R=200]

Em sua segunda pergunta, se o arquivo .htaccess não estiver sendo lido, é possível que a configuração principal do Apache do servidor esteja AllowOverridedefinida como None. A documentação do Apache tem dicas de solução de problemas para esse e outros casos que podem estar impedindo que o .htaccess entre em vigor.

Finalmente, para responder à sua terceira pergunta, se você precisar depurar variáveis específicas que você está referenciando em sua regra de reescrita ou está usando um fazendo expressão que deseja avaliar independentemente da regra, você pode fazer o seguinte:

Envie a variável que você está referenciando para garantir que ela tenha o valor que você espera:

ErrorDocument 200 "Request: %{THE_REQUEST} Referrer: %{HTTP_REFERER} Host: %{HTTP_HOST}"
RewriteRule ^ - [L,R=200]

Teste a expressão independentemente, colocando-a em uma <If>diretiva. Isso permite que você certifique-se de que sua expressão seja escrita corretamente ou correspondendo quando você espera que:

<If "%{REQUEST_URI} =~ /word$/">
    ErrorDocument 200 "Your expression is priceless!"
    RewriteRule ^ - [L,R=200]
</If>

Boa depuração do .htaccess!

PeterA
fonte
3

Se você tiver acesso ao diretório bin do apache, você pode usar,

httpd -M para verificar os módulos carregados primeiro.

 info_module (shared)
 isapi_module (shared)
 log_config_module (shared)
 cache_disk_module (shared)
 mime_module (shared)
 negotiation_module (shared)
 proxy_module (shared)
 proxy_ajp_module (shared)
 rewrite_module (shared)
 setenvif_module (shared)
 socache_shmcb_module (shared)
 ssl_module (shared)
 status_module (shared)
 version_module (shared)
 php5_module (shared)

Depois disso, diretivas simples como Options -Indexesou deny from allirão solidificar que .htaccess estão funcionando corretamente.

Abhishek Gurjar
fonte
1

Para testar suas regras de reescrita do htaccess, simplesmente preencha o url ao qual você está aplicando as regras, coloque o conteúdo do seu htaccess na área de entrada maior e pressione o botão "Testar".

http://htaccess.mwl.be/

Ganesh Kandu
fonte
-1

Por que não colocar algum lixo em seu arquivo .htaccess e tentar recarregar o apache. Se o apache não iniciar, você sabe que está funcionando. Remova o lixo e recarregue o apache se ele carregar, parabéns, você configurou o .htaccess corretamente.

Ben Rabidou
fonte
7
Não acho que o Apache irá falhar ao iniciar ou executar se houver um .htaccess inválido, visto que ele não verifica o .htaccess até que haja uma solicitação de página.
Andrew