Prefacio
Soy muy neófito con respecto a los servidores web. Estoy configurando un servidor Apache2 y actualmente revisando detenidamente la documentación.
Me di cuenta de que el <Directory>
, <Location>
y <Files>
las directivas de cada una correspondiente <*Match>
Directiva: <DirectoryMatch>
, <LocationMatch>
y <FilesMatch>
respectivamente. La diferencia en la superficie es bastante evidente:
<*Match>
las directivas toman una expresión regular como argumento- Las directivas que no coinciden toman una cadena simple o un globo de estilo shell como argumento.
Curiosamente, las directivas que no coinciden también pueden recibir una expresión regular como argumento si está precedido por un '~'. Por lo tanto, las siguientes dos líneas deberían ser idénticas:
# From the Apache2 docs
<Directory ~ "^/www/[0-9]{3}"> ... </Directory>
<DirectoryMatch "^/www/[0-9]{3}"> ... </DirectoryMatch>
Preguntas
Lo que me gustaría saber es si hay o no diferencias sutiles o clave para tener en cuenta que los core
documentos de Apache no mencionan. La <DirectoryMatch>
sección menciona una sutil diferencia:
Compatibilidad
Antes de 2.3.9 , esta directiva se aplicaba implícitamente a subdirectorios (como
<Directory>
) y no podía coincidir con el símbolo de fin de línea ($). En 2.3.9 y posteriores , solo los directorios que coinciden con la expresión se ven afectados por las directivas adjuntas.
Más allá de eso, me gustaría saber:
- ¿Hay alguna otra diferencia entre las directivas Match y no Match?
- ¿Qué directiva es más preferible cuando se requiere una expresión regular?
- ¿Alguna otra información que considere pertinente?
Notas
<DirectoryMatch>
y<Directory "~">
están en el mismo nivel de fusión- Si bien no se menciona explícitamente,
<Directory "~">
puede usar grupos con nombre y referencias posteriores, al igual que<DirectoryMatch>
.
fuente
<Directory ~
y<DirectoryMatch
no<Directory
. Hasta Apache 2.3.9,<Directory ~
era posiblemente el superconjunto porque soportaba el$
anclaje regex, mientras<DirectoryMatch
que no. (Esto también puede haber sido por qué la recomendación de usarDirectoryMatch
se eliminó en los documentos anteriores?)DirectoryMatch
sigue siendo superior porqueDirectory ~
se maneja solo después deDirectory
declaraciones " normales " y leDirectoryMatch
permite capturar datos que puede usar posteriormente". - pero como señaló el OP, estas directivas son las mismas en ambos aspectos.DirectoryMatch
es más fácil de leer y, por lo tanto, preferible (terminarDirectory ~
). Si bien los documentos no indican explícitamente esto,DirectoryMatch
se usa en todos los ejemplos recientes (por ejemplo, en la página de Secciones de configuración ) yDirectory ~
nunca se menciona. Los documentos, sin embargo, afirman explícitamente que los nombres similaresLocationMatch
yFilesMatch
son preferibles a la~
versión correspondiente de estas directivas.DirectoryMatch
no era compatible con el$
ancla antes de Apache 2.3.9? Los commits que encontré están relacionados con Apache 1.2 / 1.3, hasta ahora.<Directory ~
incluso incluyeron el ancla de fin de cadena. Sí, veo que esos commits son de 1.2 / 1.3 - ¡buena excavación! :) También se indica en los documentos de Apache 1.3 cuandoDirectoryMatch
se introdujo. También hubo cambios en Apache 1.3 (desde 1.2) con respecto a cómo se fusionaron los contenedores regex (es decir,<Directory ~
y los recién introducidos<DirectoryMatch
).No es estrictamente una diferencia entre las dos versiones de expresiones regulares (
<Directory ~
y<DirectoryMatch
), pero algunas directivas, comoAllowOverride
yAllowOverrideList
, solo se permiten en un<Directory>
contenedor simple (sin expresiones regulares) . Entonces, eso excluye ambos<Directory ~
y<DirectoryMatch
.Referencia:
https://httpd.apache.org/docs/2.4/mod/core.html#allowoverride
fuente