Prefácio
Sou um neófito em relação aos servidores da web. Estou configurando um servidor Apache2 e atualmente examinando a documentação.
Notei que o <Directory>
, <Location>
e <Files>
directivas cada um tem um correspondente <*Match>
directiva: <DirectoryMatch>
, <LocationMatch>
e <FilesMatch>
respectivamente. A diferença na superfície é aparente o suficiente:
<*Match>
diretivas usam uma expressão regular como argumento- As diretivas não correspondentes consideram uma cadeia simples ou um estilo de shell como argumento.
Curiosamente, as diretivas que não são de correspondência também podem receber uma expressão regular como argumento se forem precedidas por um '~'. Assim, as duas linhas a seguir devem ser idênticas:
# From the Apache2 docs
<Directory ~ "^/www/[0-9]{3}"> ... </Directory>
<DirectoryMatch "^/www/[0-9]{3}"> ... </DirectoryMatch>
Questões
O que eu gostaria de saber é se há ou não diferenças sutis ou importantes que os core
documentos do Apache não mencionam. A <DirectoryMatch>
seção menciona uma diferença sutil:
Compatibilidade
Antes da 2.3.9 , esta diretiva aplicava-se implicitamente aos subdiretórios (como
<Directory>
) e não podia corresponder ao símbolo de fim de linha ($). No 2.3.9 e posterior , apenas os diretórios que correspondem à expressão são afetados pelas diretivas incluídas.
Além disso, gostaria de saber:
- Existem outras diferenças entre as diretivas de correspondência e não de correspondência?
- Qual diretiva é mais preferível quando uma expressão regular é necessária?
- Alguma outra informação que considere pertinente?
Notas
<DirectoryMatch>
e<Directory "~">
estão no mesmo nível de mesclagem- Embora não mencionado explicitamente,
<Directory "~">
pode usar grupos nomeados e referências anteriores, assim como<DirectoryMatch>
.
fonte
<Directory ~
e<DirectoryMatch
, não<Directory
. Até o Apache 2.3.9,<Directory ~
era indiscutivelmente o superconjunto, porque suportava a$
âncora regex, enquanto<DirectoryMatch
que não. (Isso também pode ter sido por isso a recomendação de usoDirectoryMatch
foi removido nos docs anteriores?)DirectoryMatch
ainda é superior porqueDirectory ~
é tratado apenas apósDirectory
instruções " normais " eDirectoryMatch
permite capturar dados que você pode usar posteriormente." - mas, como observado pelo PO, essas diretivas são as mesmas em ambos os aspectos.DirectoryMatch
é mais fácil de ler e, portanto, preferível (acimaDirectory ~
). Embora os documentos não declarem explicitamente isso,DirectoryMatch
é usado em todos os exemplos recentes (por exemplo, na página Seções de configuração ) eDirectory ~
nunca recebe uma menção. Os documentos, no entanto, afirmam explicitamente que os nomes semelhantesLocationMatch
eFilesMatch
são preferíveis à~
versão correspondente dessas diretivas.DirectoryMatch
não suportava a$
âncora antes do Apache 2.3.9? Os commits que encontrei estão relacionados ao Apache 1.2 / 1.3, até agora.<Directory ~
inclusive incluíam a âncora de fim de cadeia. Sim, vejo que esses commits são de 1.2 / 1.3 - boa escavação! :) Também está indicado nos documentos do Apache 1.3 quandoDirectoryMatch
foi introduzido. Também houve alterações no Apache 1.3 (de 1.2) com relação à forma como os contêineres regex (por exemplo,<Directory ~
e os que acabamos de apresentar<DirectoryMatch
) foram mesclados.Não é estritamente uma diferença entre as duas versões de regex (
<Directory ~
e<DirectoryMatch
), mas algumas diretivas, comoAllowOverride
eAllowOverrideList
, são permitidas apenas em um<Directory>
contêiner simples (sem regex) . Então, isso exclui ambos<Directory ~
e<DirectoryMatch
.Referência:
https://httpd.apache.org/docs/2.4/mod/core.html#allowoverride
fonte