Ordre d'exécution et priorité de htaccess

19

Quelqu'un peut-il m'expliquer dans quel ordre apache exécute les fichiers .htaccess résidant à différents niveaux du même chemin et comment les règles de réécriture qui s'y trouvent sont hiérarchisées?

Par exemple, pourquoi la règle de réécriture du premier .htaccess ci-dessous ne fonctionne-t-elle pas et celle-ci est-elle /blogpriorisée?

.htaccess dans /

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

.htaccess dans /blog

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

PS: Je ne cherche pas simplement une réponse mais un moyen de comprendre les internes d'apache / mod_rewrite ... pourquoi est plus important pour moi que comment y remédier,

ChrisR
la source

Réponses:

20

Je suppose que vous devriez lire le tutoriel Apache: .htaccess , principalement la section "Comment les directives sont appliquées", qui dit:

Les directives de configuration trouvées dans un fichier .htaccess sont appliquées au répertoire dans lequel se trouve le fichier .htaccess et à tous ses sous-répertoires. Cependant, il est important de se rappeler également qu'il peut y avoir eu des fichiers .htaccess dans des répertoires plus haut. Les directives sont appliquées dans l'ordre où elles sont trouvées. Par conséquent, un fichier .htaccess dans un répertoire particulier peut remplacer les directives trouvées dans les fichiers .htaccess trouvés plus haut dans l'arborescence de répertoires. Et celles-ci, à leur tour, peuvent avoir des directives remplacées trouvées encore plus haut, ou dans le fichier de configuration du serveur principal lui-même.

Donnez-lui une lecture complète et .htaccess ne sera plus un mystère.

Tom Pietrosanti
la source
7
mod_rewrite est un cas particulier. Les règles de réécriture sont appliquées de bas en haut. D'abord les règles du sous-répertoire puis les règles du répertoire parent.
GetFree
Le document répertorié ci-dessus concerne Apache 2.2. Pour la version actuelle d'apache, allez plutôt à ce lien httpd.apache.org/docs/current/howto/htaccess.html
SherylHohman
3

Vous pouvez utiliser RewriteOptions inheritpour hériter des règles de réécriture du répertoire parent. Cependant, les règles de réécriture du répertoire parent seront appliquées ultérieurement, conformément à la documentation sur RewriteOptions .

Lèse majesté
la source
1
Les directives de réécriture pour les répertoires parents seront appliquées même sans cette instruction (ce qui est quelque peu déroutant) mais je suppose que cela peut être utilisé pour effectuer un copier + coller virtuel des directives du parent vers l'enfant (qui peut avoir différentes bases de réécriture). Pas étonnant que mod_rewrite se gêne parfois avec la tête ... Argh.
Simon East
2
@SimonEast "Les directives de réécriture pour les répertoires parents seront appliquées même sans cette déclaration" - Êtes-vous sûr? Avez-vous une référence? Plus précisément, les mod_rewritedirectives ne sont pas héritées par défaut (différentes des autres modules). Vous auriez besoin d'une RewriteOptions InheritXXXXdirective quelque part pour que les directives soient héritées. Cependant, cela devient plus complexe sur Apache 2.4+ avec l' InheritDownoption qui peut être spécifiée dans les répertoires parents et la configuration du serveur qui contrôle ensuite les répertoires enfants.
MrWhite