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 coredocumentos 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<DirectoryMatchno<Directory. Hasta Apache 2.3.9,<Directory ~era posiblemente el superconjunto porque soportaba el$anclaje regex, mientras<DirectoryMatchque no. (Esto también puede haber sido por qué la recomendación de usarDirectoryMatchse eliminó en los documentos anteriores?)DirectoryMatchsigue siendo superior porqueDirectory ~se maneja solo después deDirectorydeclaraciones " normales " y leDirectoryMatchpermite capturar datos que puede usar posteriormente". - pero como señaló el OP, estas directivas son las mismas en ambos aspectos.DirectoryMatches más fácil de leer y, por lo tanto, preferible (terminarDirectory ~). Si bien los documentos no indican explícitamente esto,DirectoryMatchse 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 similaresLocationMatchyFilesMatchson preferibles a la~versión correspondiente de estas directivas.DirectoryMatchno 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 cuandoDirectoryMatchse 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, comoAllowOverrideyAllowOverrideList, 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