Desculpe se isso já foi perguntado/respondido antes, mas não consegui encontrar uma resposta para esse problema específico.
Se eu criar um arquivo .htaccess com uma regra de reescrita simples, essa regra funcionará. Se eu criar outro arquivo .htaccess em um subdiretório com sua própria configuração de reescrita, o arquivo .htaccess principal no nível superior deixará de ser lido. Eu nem preciso criar nenhuma regra. Simplesmente ativar o mecanismo de reescrita no subdiretório faz com que as reescritas de nível superior parem de funcionar.
Criei um conjunto de subdiretórios com dois arquivos de texto:
[root@apachetest html]# cat test/1/test.txt
1
[root@apachetest html]# cat test/2/test.txt
2
E um arquivo .htaccess para reescrever test/1/test.txt para test/2/test.txt
[root@apachetest html]# cat test/.htaccess
RewriteEngine on
RewriteRule 1/test.txt 2/test.txt [L]
Isso funciona conforme o esperado. Se eu solicitar 1/test.txt, recebo 2/test.txt
[root@apachetest html]# curl localhost/test/1/test.txt
2
Mas se eu criar outro arquivo .htaccess dentro do subdiretório test/1/, o arquivo test/.htaccess para de funcionar.
[root@apachetest html]# echo "RewriteEngine On" > test/1/.htaccess
[root@apachetest html]# curl localhost/test/1/test.txt
1
Eu tentei todas as RewriteOptions; Inherit, InheritBefore, InheritDown, InheritDownBefore e IgnoreInherit em /test/.htaccess e /test/1/.htaccess, mas não consigo fazer com que /test/.htaccess RewriteRule funcione se /test/1/.htaccess tem alguma configuração de reescrita nele.
Preciso poder colocar RewriteRules no subdiretório sem afetar o RewriteRules no diretório de nível superior. Alguém pode me dizer o que estou perdendo?
Sim, por padrão, as diretivas mod_rewrite não são herdadas pelas configurações filhas. Portanto, se você tiver diretivas mod_rewrite em um
.htaccess
arquivo de subdiretório (mesmo que apenas habilite ou desabilite o mecanismo de reescrita), as diretivas mod_rewrite no diretório pai/config serão completamente substituídas - elas não serão processadas.Sim, é isso que você precisa fazer para habilitar a herança mod_rewrite. A opção escolhida depende de onde e quando você deseja que as diretivas pai/filho sejam herdadas.
NO ENTANTO, o "problema" é a maneira como as diretivas mod_rewrite são "herdadas". Eles são herdados copiando efetivamente as diretivas na respectiva configuração. Eles não são processados no contexto da configuração original. Isso afeta coisas como caminhos de URL relativos. Normalmente, a
RewriteRule
diretiva corresponde a um caminho de URL relativo ao diretório que contém o.htaccess
arquivo. No entanto, se essas diretivas forem "herdadas" (ou seja, efetivamente copiadas) em uma configuração filha, esses caminhos de URL relativos serão diferentes e a regra poderá não corresponder mais.As diretivas "herdadas" precisam ser escritas de forma que não dependam do diretório no qual são processadas - portanto, você não pode necessariamente confiar no
RewriteRule
padrão ao herdar diretivas em um contexto de diretório .Então, usando seu exemplo...
E habilitamos a herança mod_rewrite no arquivo
/test/1
do subdiretório.htaccess
:Isso efetivamente resulta no seguinte processamento ao solicitar
/test/1/test.txt
:Claramente, o
RewriteRule
padrão1/test.txt
notest/1/.htaccess
arquivo nunca corresponderá, então a regra não faz nada. (A regra precisaria ser modificada para corresponder a justtest.txt
, mas a substituição também precisaria ser modificada, caso contrário, reescreveria a solicitação para/test/1/2/test.txt
- o que não existe.)As diretivas na configuração herdada/pai precisariam ser modificadas para evitar a dependência do diretório no qual o pai
.htaccess
está localizado. Por exemplo:A condição repete efetivamente o teste para
test.txt
, mas é mais específica. Você poderia tornar oRewriteRule
padrão totalmente genérico, mas a regra será processada para cada solicitação.NB: Capturei o primeiro segmento do caminho e usei a referência anterior correspondente
%1
na substituição para evitar a necessidade de codificar o diretório no qual o.htaccess
arquivo está localizado.Este modal de "herança" é mais problemático/complexo quando mod_rewrite é usado em um contexto de diretório (
.htaccess
). (mod_rewrite geralmente é mais complexo quando usado em um contexto de diretório .) O problema do caminho relativo não é um problema com as diretivas na configuração do servidor/virtualhost, pois os caminhos são todos relativos à raiz.