Kolejność i priorytet wykonania htaccess

19

Czy ktoś może mi wyjaśnić, w jakiej kolejności apache wykonuje pliki .htaccess znajdujące się na różnych poziomach tej samej ścieżki i w jaki sposób reguły przepisywania w nich są traktowane priorytetowo?

Na przykład, dlaczego reguła przepisywania w pierwszym .htaccess poniżej nie działa i czy ta zasada ma /blogpriorytet?

.htaccess in /

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

.htaccess in /blog

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

PS: Nie szukam tylko odpowiedzi, ale sposobu na zrozumienie wewnętrznych elementów apache / mod_rewrite ... dlaczego jest dla mnie ważniejszy niż jak to naprawić,

ChrisR
źródło

Odpowiedzi:

20

Przypuszczam, że powinieneś przeczytać samouczek Apache: .htaccess , głównie sekcję „Jak stosować dyrektywy”, która stwierdza:

Dyrektywy konfiguracyjne znalezione w pliku .htaccess są stosowane do katalogu, w którym znajduje się plik .htaccess, oraz do wszystkich jego podkatalogów. Należy jednak pamiętać, że w wyższych katalogach mogły znajdować się pliki .htaccess. Dyrektywy są stosowane w kolejności ich znalezienia. Dlatego plik .htaccess w określonym katalogu może zastępować dyrektywy znajdujące się w plikach .htaccess znajdujących się wyżej w drzewie katalogów. A te z kolei mogły zastąpić dyrektywy znajdujące się wyżej lub w samym głównym pliku konfiguracyjnym serwera.

Daj mu pełną lekturę, a dostęp do .htac nie będzie już tajemnicą.

Tom Pietrosanti
źródło
7
mod_rewrite jest specjalnym przypadkiem. Reguły przepisywania są stosowane od dołu. Najpierw reguły w podkatalogu, a następnie reguły w katalogu nadrzędnym.
GetFree,
Dokument wymieniony powyżej dotyczy Apache 2.2. Aby uzyskać aktualną wersję apache, przejdź do tego linku zamiast httpd.apache.org/docs/current/howto/htaccess.html
SherylHohman
3

Możesz użyć RewriteOptions inheritdo dziedziczenia reguł przepisywania katalogu nadrzędnego. Jednak reguły przepisywania katalogu nadrzędnego zostaną zastosowane później, zgodnie z dokumentacją RewriteOptions .

Lèse majesté
źródło
1
Dyrektywy przepisz dla katalogów nadrzędnych zostaną zastosowane nawet bez tego oświadczenia (co jest nieco mylące), ale przypuszczam, że można go użyć do wykonania wirtualnej kopii + wklejenia dyrektyw od rodzica do dziecka (które mogą mieć różne podstawy przepisywania). Nic dziwnego, że mod_rewrite czasami gada z głową ... Argh.
Simon East
2
@ SimonEast „Przepisz dyrektywy dla katalogów nadrzędnych będą stosowane nawet bez tego oświadczenia” - Jesteś pewien? Czy masz referencje? W szczególności mod_rewritedyrektywy nie są dziedziczone domyślnie (inaczej niż inne moduły). Potrzebny jest RewriteOptions InheritXXXXdyrektywa gdzieś do dyrektyw być dziedziczone. Jest to jednak bardziej skomplikowane w Apache 2.4+ z InheritDownopcją, którą można określić w katalogach nadrzędnych i konfiguracji serwera, która następnie kontroluje katalogi podrzędne.
MrWhite