Eu suspeito que você possa evitar o loop infinito em seu segundo conjunto de regras colocando as diretivas de reconfiguração na configuração principal do host virtual, não em um arquivo .htaccess
. Em geral, isso é uma boa prática, já que a regravação é muito mais rápida quando você a coloca no host virtual, e você pode obter mais benefícios de velocidade se puder dizer ao Apache para ignorar .htaccess
arquivos juntos.
A lógica por trás disso é explicada na documentação técnica do mod_rewrite . Aqui está a essência: como você sabe, as regras de reescrita podem alterar o nome do arquivo a que uma determinada solicitação corresponde, e até mesmo em qual diretório o arquivo resultante está. De fato, o seu
RewriteRule ^$ /blog/
é um exemplo perfeito, que altera a raiz do documento para o diretório blog
. Mas o Apache precisa saber o diretório para descobrir quais arquivos .htaccess
devem verificar a solicitação. Talvez você possa ver o problema aqui: no momento em que o Apache alcança seu arquivo .htaccess
, ele já determinou o nome do arquivo que deveria estar acessando, o que significa que é tarde demais para suas regras de reescrita aplicar.
O Apache internamente resolve esse problema criando uma nova subrequisa, que inicia o processamento desde o início, e injetando as regras do seu arquivo .htaccess
no fluxo de processamento para que elas sejam aplicadas à solicitação. Como um efeito colateral disso, todas regras de reescrita aplicáveis são aplicadas novamente , e isso significa que o [L]
é um tipo de mentira quando você o usa em .htaccess
file. Então, mesmo que você coloque [L]
em sua regra para tentar forçá-la a ser a última regra aplicada, ela realmente não é; todas as regras são aplicadas novamente quando o Apache processa sua sub-requisição interna.
Se você não tiver acesso à configuração principal do servidor, poderá fazer isso:
RewriteRule ^/blog/?$ / [R,L,NS]
O sinalizador NS
impede que a regra seja aplicada a sub-solicitações.