htaccess ordine di esecuzione e priorità


19

Qualcuno può spiegarmi in che ordine apache esegue i file .htaccess che risiedono in diversi livelli dello stesso percorso e in che modo viene data priorità alle regole di riscrittura?

Ad esempio, perché la regola di riscrittura nel primo .htaccess di seguito non funziona ed è quella con /blogpriorità?

.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: Non sto semplicemente cercando una risposta ma un modo per capire gli interni di apache / mod_rewrite ... perché per me è più importante di come risolverlo,

Risposte:


20

Suppongo che dovresti leggere il tutorial di Apache: .htaccess , principalmente la sezione "Come vengono applicate le direttive", che afferma:

Le direttive di configurazione trovate in un file .htaccess vengono applicate alla directory in cui si trova il file .htaccess e a tutte le sue sottodirectory. Tuttavia, è importante ricordare anche che potrebbero esserci dei file .htaccess nelle directory più in alto. Le direttive vengono applicate nell'ordine in cui sono state trovate. Pertanto, un file .htaccess in una particolare directory può sovrascrivere le direttive presenti nei file .htaccess che si trovano più in alto nella struttura della directory. E quelli, a loro volta, potrebbero avere direttive sostituite ancora più in alto, o nel file di configurazione del server principale stesso.

Dagli una lettura completa e .htaccess non sarà più un mistero.


7
mod_rewrite è un caso speciale. Le regole di riscrittura vengono applicate dal basso verso l'alto. Prima le regole nella sottodirectory, quindi le regole nella directory principale.
GetFree

Il documento sopra elencato è per Apache 2.2. Per la versione corrente di apache, vai a questo link invece httpd.apache.org/docs/current/howto/htaccess.html
SherylHohman

3

È possibile utilizzare RewriteOptions inheritper ereditare le regole di riscrittura della directory principale. Tuttavia, le regole di riscrittura della directory principale verranno applicate in seguito, come indicato nella documentazione su RewriteOptions .


1
Le direttive di riscrittura per le directory madri verranno applicate anche senza questa affermazione (il che è un po 'confuso) ma suppongo che questo possa essere usato per eseguire una copia virtuale + incolla di direttive dal genitore al figlio (che può avere basi di riscrittura diverse). Non c'è da stupirsi che a volte mod_rewrite ti rovini la testa ... Argh.
Simon East,

2
@SimonEast "Le direttive di riscrittura per le directory principali verranno applicate anche senza questa dichiarazione" - Sei sicuro? Hai un riferimento? In particolare, le mod_rewritedirettive non sono ereditate per impostazione predefinita (diversamente da altri moduli). Avresti bisogno di una RewriteOptions InheritXXXXdirettiva da qualche parte per ereditare le direttive. Tuttavia, questo diventa più complesso su Apache 2.4+ con l' InheritDownopzione che può essere specificata nelle directory principali e nella configurazione del server che controlla quindi le directory secondarie.
MrWhite,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.