orden de ejecución de htaccess y prioridad

19

¿Alguien puede explicarme en qué orden apache ejecuta archivos .htaccess que residen en diferentes niveles de la misma ruta y cómo se priorizan las reglas de reescritura?

Por ejemplo, ¿por qué no funciona la regla de reescritura en el primer .htaccess a continuación y se /blogprioriza?

.htaccess en /

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

.htaccess en /blog

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

PD: no solo estoy buscando una respuesta, sino una forma de entender los aspectos internos de apache / mod_rewrite ... por qué es más importante para mí que cómo solucionar esto,

ChrisR
fuente

Respuestas:

20

Supongo que debería leer el Tutorial de Apache: .htaccess , principalmente la sección "Cómo se aplican las directivas", que dice:

Las directivas de configuración que se encuentran en un archivo .htaccess se aplican al directorio en el que se encuentra el archivo .htaccess y a todos sus subdirectorios. Sin embargo, es importante recordar también que puede haber archivos .htaccess en directorios superiores. Las directivas se aplican en el orden en que se encuentran. Por lo tanto, un archivo .htaccess en un directorio particular puede anular las directivas que se encuentran en los archivos .htaccess que se encuentran más arriba en el árbol de directorios. Y esos, a su vez, pueden tener directivas anuladas que se encuentran aún más arriba, o en el archivo de configuración del servidor principal.

Dale una lectura completa y .htaccess ya no será un misterio.

Tom Pietrosanti
fuente
77
mod_rewrite es un caso especial. Las reglas de reescritura se aplican de abajo hacia arriba. Primero las reglas en el subdirectorio y luego las reglas en el directorio padre.
GetFree
El documento mencionado anteriormente es para Apache 2.2. Para la versión actual de apache, vaya a este enlace en su
SherylHohman
3

Puede usar RewriteOptions inheritpara heredar las reglas de reescritura del directorio principal. Sin embargo, las reglas de reescritura del directorio principal se aplicarán más adelante, según la documentación de RewriteOptions .

Lèse majesté
fuente
1
Las directivas de reescritura para directorios primarios se aplicarán incluso sin esta declaración (lo cual es algo confuso), pero supongo que esto se puede usar para realizar una copia virtual + pegar directivas del primario al secundario (que pueden tener diferentes bases de reescritura). No es de extrañar que mod_rewrite se meta a veces con tu cabeza ... Argh.
Simon East
2
@SimonEast "Las directivas de reescritura para directorios principales se aplicarán incluso sin esta declaración" - ¿Está seguro? Tiene una referencia? Específicamente, las mod_rewritedirectivas no se heredan por defecto (diferentes a otros módulos). Necesitaría una RewriteOptions InheritXXXXdirectiva en algún lugar para que las directivas se hereden. Sin embargo, esto se vuelve más complejo en Apache 2.4+ con la InheritDownopción que se puede especificar en los directorios principales y la configuración del servidor que luego controla los directorios secundarios.
MrWhite