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?

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

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.


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.


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


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!


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.


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/


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


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