ordem de execução htaccess e prioridade

19

Alguém pode me explicar em que ordem o apache executa arquivos .htaccess que residem em diferentes níveis do mesmo caminho e como as regras de reescrita são priorizadas?

Por exemplo, por que a regra de reescrita no primeiro .htaccess abaixo funciona e é /blogpriorizada?

.htaccess em /

RewriteEngine on
RewriteBase /
RewriteRule ^blog offline.html [L]

.htaccess em /blog

RewriteEngine On
RewriteBase /blog/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /blog/index.php [L]

PS: Não estou simplesmente procurando uma resposta, mas uma maneira de entender os internos do apache / mod_rewrite ... por que é mais importante para mim do que como corrigir isso,

ChrisR
fonte

Respostas:

20

Suponho que você deva ler o Tutorial do Apache: .htaccess , principalmente a seção "Como as diretivas são aplicadas", que declara:

As diretivas de configuração encontradas em um arquivo .htaccess são aplicadas ao diretório em que o arquivo .htaccess é encontrado e a todos os subdiretórios. No entanto, é importante lembrar também que pode haver arquivos .htaccess em diretórios superiores. As diretivas são aplicadas na ordem em que são encontradas. Portanto, um arquivo .htaccess em um diretório específico pode substituir as diretivas encontradas nos arquivos .htaccess encontrados mais acima na árvore de diretórios. E essas, por sua vez, podem ter substituído diretivas encontradas ainda mais acima ou no próprio arquivo de configuração do servidor.

Dê uma leitura completa e o .htaccess não será mais um mistério.

Tom Pietrosanti
fonte
7
mod_rewrite é um caso especial. As regras de reescrita são aplicadas de baixo para cima. Primeiro as regras no subdiretório e depois as regras no diretório pai.
GetFree
O documento listado acima é para o Apache 2.2. Para a versão atual do apache, acesse este link em vez disso httpd.apache.org/docs/current/howto/htaccess.html
SherylHohman
3

Você pode usar RewriteOptions inheritpara herdar as regras de reescrita do diretório pai. No entanto, as regras de reescrita do diretório pai serão aplicadas posteriormente, conforme a documentação em RewriteOptions .

Lèse majesté
fonte
1
As diretivas de reescrita para diretórios-pai serão aplicadas mesmo sem essa declaração (o que é um pouco confusa), mas suponho que isso possa ser usado para executar uma cópia virtual + colar de diretivas do pai para o filho (que podem ter diferentes bases de reescrita). Não é de admirar que mod_rewrite mexa com sua cabeça às vezes ... Argh.
Simon East
2
@SimonEast "As diretivas de reescrita para diretórios-pai serão aplicadas mesmo sem essa declaração" - Você tem certeza? Você tem uma referência? Especificamente, as mod_rewritediretivas não são herdadas por padrão (diferentes de outros módulos). Você precisaria de uma RewriteOptions InheritXXXXdiretiva em algum lugar para as diretivas serem herdadas. No entanto, isso fica mais complexo no Apache 2.4+ com a InheritDownopção que pode ser especificada nos diretórios pai e na configuração do servidor que controla os diretórios filhos.
MrWhite