Muitos pôsteres têm problemas ao depurar suas instruções RewriteRule e RewriteCond em seus .htaccess
arquivos. A maioria deles está usando um serviço de hospedagem compartilhada e, portanto, não tem acesso à configuração do servidor raiz. Eles não podem evitar o uso de .htaccess
arquivos para reescrever e não podem ativar um RewriteLogLevel ", como sugerem muitos entrevistados. Além disso, existem muitas .htaccess
armadilhas e restrições específicas que não são bem cobertas. A configuração de uma pilha LAMP de teste local envolve muita curva de aprendizado para a maioria dos usuários. .
Portanto, meu Q aqui é como recomendamos que eles próprios depurem suas regras . Eu forneço algumas sugestões abaixo. Outras sugestões seriam apreciadas.
Entenda que o mecanismo mod_rewrite alterna entre
.htaccess
arquivos . O mecanismo executa este loop:do execute server and vhost rewrites (in the Apache Virtual Host Config) find the lowest "Per Dir" .htaccess file on the file path with rewrites enabled if found(.htaccess) execute .htaccess rewrites (in the user's directory) while rewrite occurred
Portanto, suas regras serão executadas repetidamente e, se você alterar o caminho do URI, poderá acabar executando outros
.htaccess
arquivos, se existirem. Portanto, certifique-se de encerrar esse loop, se necessário, adicionando extraRewriteCond
para interromper o disparo das regras. Exclua também quaisquer.htaccess
conjuntos de regras de reescrita de nível inferior, a menos que haja intenção explícita de usar conjuntos de regras de vários níveis.Certifique-se de que a sintaxe de cada Regexp esteja correta testando contra um conjunto de padrões de teste para garantir que seja uma sintaxe válida e faça o que você pretende com uma gama completa de URIs de teste. Veja a resposta abaixo para mais detalhes.
Construa suas regras incrementalmente em um diretório de teste. Você pode usar o
.htaccess
recurso "executar o arquivo mais profundo no caminho" para configurar um diretório de teste separado (árvore) e depurar conjuntos de regras aqui sem estragar suas regras principais e interromper o funcionamento do site. Você deve adicioná-los um de cada vez, porque esta é a única maneira de localizar falhas em regras individuais.Use um stub de script fictício para despejar variáveis de servidor e ambiente . (Consulte a Listagem 2 ) Se seu aplicativo usar, digamos,
blog/index.php
você poderá copiá-lotest/blog/index.php
e usá-lo para testar as regras do seu blog notest
subdiretório. Você também pode usar variáveis de ambiente para garantir que o mecanismo de reescrita na interpretação correta das cadeias de substituição, por exemplo,RewriteRule ^(.*) - [E=TEST0:%{DOCUMENT_ROOT}/blog/html_cache/$1.html]
e procure essas variáveis REDIRECT_ * no dump do phpinfo. BTW, eu usei este e descobri no meu site que eu tinha que usar em seu
%{ENV:DOCUMENT_ROOT_REAL}
lugar. No caso do redirecionador executar um loop, as variáveis REDIRECT_REDIRECT_ * listam a passagem anterior. Etc.Certifique-se de que você não seja mordido pelo navegador fazendo o cache de redirecionamentos 301 incorretos . Veja a resposta abaixo . Meus agradecimentos a Ulrich Palha por isso.
O mecanismo de reescrita parece sensível às regras em cascata dentro de um
.htaccess
contexto (é aí queRewriteRule
resulta em uma substituição e isso cai para outras regras), pois encontrei bugs com sub-solicitações internas (1) e processamento PATH_INFO incorreto que geralmente pode evita o uso dos sinalizadores [NS], [L] e [PT].
Mais algum comentário ou sugestão?
Listagem 1 - phpinfo
<?php phpinfo(INFO_ENVIRONMENT|INFO_VARIABLES);