Préface
Je suis très néophyte des serveurs Web. J'installe un serveur Apache2 et examine actuellement la documentation.
J'ai remarqué que la <Directory>
, <Location>
et les <Files>
directives ont chacune une correspondante <*Match>
directive: <DirectoryMatch>
, <LocationMatch>
et <FilesMatch>
respectivement. La différence en surface est assez apparente:
<*Match>
les directives prennent une expression régulière comme argument- Les directives non-Match prennent comme argument une chaîne simple ou un glob de style shell.
Curieusement, les directives non-Match peuvent également recevoir une expression régulière comme argument si elle est précédée d'un '~'. Ainsi, les deux lignes suivantes doivent être identiques:
# From the Apache2 docs
<Directory ~ "^/www/[0-9]{3}"> ... </Directory>
<DirectoryMatch "^/www/[0-9]{3}"> ... </DirectoryMatch>
Des questions
Ce que j'aimerais savoir, c'est s'il y a ou non des différences subtiles ou clés à savoir que les core
documents d'Apache ne mentionnent pas. La <DirectoryMatch>
section mentionne une différence subtile:
Compatibilité
Avant la 2.3.9 , cette directive s'appliquait implicitement aux sous-répertoires (comme
<Directory>
) et ne pouvait pas correspondre au symbole de fin de ligne ($). Dans 2.3.9 et versions ultérieures , seuls les répertoires qui correspondent à l'expression sont affectés par les directives jointes.
Au-delà, j'aimerais savoir:
- Existe-t-il d'autres différences entre les directives Match et non-Match?
- Quelle directive est plus préférable lorsqu'une expression régulière est requise?
- Avez-vous d'autres informations pertinentes?
Remarques
<DirectoryMatch>
et<Directory "~">
sont au même niveau de fusion- Bien qu'il ne soit pas explicitement mentionné, il
<Directory "~">
peut utiliser des groupes nommés et des références arrières, tout comme<DirectoryMatch>
.
la source
<Directory ~
et<DirectoryMatch
non<Directory
. Jusqu'à Apache 2.3.9,<Directory ~
était sans doute le sur-ensemble car il supportait l'$
ancre regex, alors<DirectoryMatch
que non. (C'est peut-être aussi la raison pour laquelle la recommandation d'utilisation aDirectoryMatch
été supprimée dans les documents précédents?)DirectoryMatch
est toujours supérieur car ilDirectory ~
n'est géré qu'après desDirectory
instructions " normales " etDirectoryMatch
vous permet de capturer des données que vous pourrez ensuite utiliser." - mais comme le relève le PO, ces directives sont les mêmes à ces deux égards.DirectoryMatch
c'est plus facile à lire et donc préférable (surDirectory ~
). Bien que les documents ne le disent pas explicitement, ilDirectoryMatch
est utilisé dans tous les exemples récents (par exemple sur la page des sections de configuration ) etDirectory ~
ne reçoit jamais de mention. Cependant, les documents indiquent explicitement que le même nomLocationMatch
etFilesMatch
sont préférables à la~
version correspondante de ces directives.DirectoryMatch
ne supportait pas l'$
ancre avant Apache 2.3.9? Les commits que j'ai trouvés sont liés à Apache 1.2 / 1.3, jusqu'ici.<Directory ~
même inclus l'ancre de fin de chaîne. Oui, je vois que ces commits sont de 1.2 / 1.3 - bon creusage! :) Il est également indiqué dans les documents Apache 1.3 lors deDirectoryMatch
son introduction. Il y a également eu des changements dans Apache 1.3 (par rapport à 1.2) en ce qui concerne la façon dont les conteneurs d'expressions régulières (c'est-à-dire<Directory ~
et les nouvellement introduits<DirectoryMatch
) ont été fusionnés.Pas strictement une différence entre les deux versions regex (
<Directory ~
et<DirectoryMatch
), mais certaines directives, telles queAllowOverride
etAllowOverrideList
, ne sont autorisées que dans un<Directory>
conteneur simple (non regex) . Donc, cela exclut les deux<Directory ~
et<DirectoryMatch
.Référence:
https://httpd.apache.org/docs/2.4/mod/core.html#allowoverride
la source