区别在于允许的参数类型:
<Directory directory-path> ... </Directory>
与
<DirectoryMatch regex> ... </DirectoryMatch>
DirectoryMatch
是一个超集,明智的选择,因为您将可以将任何路径编码为正则表达式。相反的说法是不正确的。
Directory ~
可能是后期添加。根据在存储库中找到的提交(1996年11月提交07b82419b59d1bb7ba8860b86a2d381d5d1090bc),此情况已在Apache 1.2中添加
DirectoryMatch
然后在Apache 1.3中添加了此功能(1997年7月提交a318749e61fda612e883a9ea594459a4517166b8),并具有一组更丰富的功能。
并且在该提交中更新的文档明确指出,使用正则表达式时,您应该偏爱匹配版本:
<Directory ~ "^/www/.*/[0-9]{3}">
</pre>
-would match directories in /www/ that consisted of three numbers.<p>
+would match directories in /www/ that consisted of three numbers. In
+Apache 1.3 and later, it is reccomended to use
+<a href="#directorymatch"><DirectoryMatch></a> instead.<p>
(此“建议使用DirectoryMatch”语句在1997年8月的提交中被删除)
DirectoryMatch
之所以具有更高的优势,Directory ~
是因为它仅在“正常” Directory
语句之后进行处理,并DirectoryMatch
允许您捕获随后可以使用的数据。
当您使用正则表达式时,我会偏爱该Match
变体,因为它使您更清楚地看到您正在使用正则表达式,而不是非匹配变体的特定情况。除了上述微小差异外,它不会产生太大差异。
实际上,由于代码执行的操作相同,因此UPDATE实际上可能不会改变结果:
static const char *dirsection(cmd_parms *cmd, void *mconfig, const char *arg)
{
...
if (!strcmp(cmd->path, "~")) {
cmd->path = ap_getword_conf(cmd->pool, &arg);
if (!cmd->path)
return "<Directory ~ > block must specify a path";
r = ap_pregcomp(cmd->pool, cmd->path, AP_REG_EXTENDED|USE_ICASE);
if (!r) {
return "Regex could not be compiled";
}
}
else if (thiscmd->cmd_data) { /* <DirectoryMatch> */
r = ap_pregcomp(cmd->pool, cmd->path, AP_REG_EXTENDED|USE_ICASE);
if (!r) {
return "Regex could not be compiled";
}
}
因此,r = ap_pregcomp(cmd->pool, cmd->path, AP_REG_EXTENDED|USE_ICASE);
在两种情况下都完全相同。
<Directory ~
和<DirectoryMatch
,而不是<Directory
。在Apache 2.3.9之前,<Directory ~
可以说是超集,因为它支持$
regex锚,而不支持<DirectoryMatch
。(这也可能就是为什么DirectoryMatch
在以前的文档中删除了使用建议的原因?)