htaccess Ausführungsreihenfolge und Priorität

19

Kann mir jemand erklären, in welcher Reihenfolge Apache .htaccess-Dateien ausführt, die sich auf verschiedenen Ebenen desselben Pfades befinden, und wie die darin enthaltenen Umschreibregeln priorisiert werden?

Warum funktioniert beispielsweise die Umschreiberegel in der ersten .htaccess-Datei unten nicht und hat die Regel /blogPriorität?

Zugang in /

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

Zugang in /blog

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

PS: Ich suche nicht einfach nach einer Antwort, sondern nach einer Möglichkeit, die Interna von apache / mod_rewrite zu verstehen ... warum ist mir wichtiger, als das zu beheben,

ChrisR
quelle

Antworten:

20

Ich nehme an, Sie sollten das Apache-Tutorial: .htaccess lesen , hauptsächlich den Abschnitt "Wie Anweisungen angewendet werden", in dem es heißt:

Die in einer .htaccess-Datei gefundenen Konfigurationsanweisungen werden auf das Verzeichnis angewendet, in dem sich die .htaccess-Datei befindet, sowie auf alle Unterverzeichnisse davon. Es ist jedoch wichtig, sich auch daran zu erinnern, dass sich möglicherweise .htaccess-Dateien in höheren Verzeichnissen befunden haben. Anweisungen werden in der Reihenfolge angewendet, in der sie gefunden wurden. Daher überschreibt eine .htaccess-Datei in einem bestimmten Verzeichnis möglicherweise die Anweisungen in .htaccess-Dateien, die sich weiter oben in der Verzeichnisstruktur befinden. Diese wiederum haben möglicherweise überschriebene Anweisungen, die sich weiter oben oder in der Konfigurationsdatei des Hauptservers befinden.

Lesen Sie es vollständig durch und der Zugriff wird kein Rätsel mehr sein.

Tom Pietrosanti
quelle
7
mod_rewrite ist ein Sonderfall. Rewrite-Regeln werden von unten nach oben angewendet. Zuerst die Regeln im Unterverzeichnis, dann die Regeln im übergeordneten Verzeichnis.
GetFree
Das oben aufgeführte Dokument ist für Apache 2.2. Die aktuelle Version von Apache finden Sie unter folgendem Link: httpd.apache.org/docs/current/howto/htaccess.html
SherylHohman,
3

Mit können Sie RewriteOptions inheritdie Umschreiberegeln des übergeordneten Verzeichnisses erben. Die Umschreibregeln des übergeordneten Verzeichnisses werden jedoch später gemäß der Dokumentation zu RewriteOptions angewendet .

Majestätsbeleidigung
quelle
1
Rewrite-Direktiven für übergeordnete Verzeichnisse werden auch ohne diese Anweisung angewendet (was etwas verwirrend ist), aber ich nehme an, dass dies verwendet werden kann, um ein virtuelles Kopieren und Einfügen von Direktiven vom übergeordneten zum untergeordneten Verzeichnis durchzuführen (die möglicherweise unterschiedliche Rewrite-Grundlagen haben). Kein Wunder, dass mod_rewrite manchmal mit deinem Kopf herumwirbelt ... Argh.
Simon East
2
@SimonEast "Schreibanweisungen für übergeordnete Verzeichnisse werden auch ohne diese Anweisung angewendet" - Sind Sie sicher? Haben Sie eine Referenz? Insbesondere werden mod_rewriteAnweisungen nicht standardmäßig vererbt (anders als bei anderen Modulen). Sie benötigen irgendwo eine RewriteOptions InheritXXXXDirektive, damit Direktiven vererbt werden können. Bei Apache 2.4+ wird dies jedoch komplexer, da die Option in übergeordneten Verzeichnissen und in der Serverkonfiguration angegeben werden kann, die dann untergeordnete Verzeichnisse steuert. InheritDown
MrWhite