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,

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.


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 .


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.