如果合适,ServerAlias 可以包含通配符。
和
通配符 * 和 ? 可用于匹配名称
我的同事声称问号可以匹配除句点 ( .
) 之外的任何字符,因此可以用作“单级”通配符。我找不到任何支持此用法的文档。
在ServerAlias
指令中,问号是什么意思?请引用文档。
答案1
您的同事说得对。?
通配符确实用于匹配.
对 DNS 名称无效的单个字符。
你可以查阅其他几份提到这个?
角色的文献,如果他们描述它的用法时总是说类似这样的话In a wild-card string, ? matches any single character, and * matches any sequences of characters.
:不幸的是,我认为人们只是忽视了到处提及这两种语法的含义。
答案2
问号 ( ?
) 匹配单个字符,包括句点。ServerAlias
用于比较主机名和es 的函数是ap_strcasecmp_match
(服务器/util.c:212)。
// server/util.c
int ap_strcasecmp_match(const char *str, const char *expected)
{
int x, y;
for (x = 0, y = 0; expected[y]; ++y, ++x) {
if (!str[x] && expected[y] != '*')
return -1;
if (expected[y] == '*') {
while (expected[++y] == '*');
if (!expected[y])
return 0;
while (str[x]) {
int ret;
if ((ret = ap_strcasecmp_match(&str[x++], &expected[y])) != 1)
return ret;
}
return -1;
}
else if (expected[y] != '?'
&& apr_tolower(str[x]) != apr_tolower(expected[y]))
return 1;
}
return (str[x] != '\0');
}
假设单独测试该函数是有意义的,那么很容易看出问号匹配单个字符,包括句点。
ap_strcasecmp_match("foo.bar.com", "?.bar.com") // 1
ap_strcasecmp_match("f.bar.com", "?.bar.com") // 0
ap_strcasecmp_match("fg.bar.com", "?.bar.com") // 1
ap_strcasecmp_match("..bar.com", "?.bar.com") // 0
ap_strcasecmp_match("f.g.bar.com", "???.bar.com") // 0
零表示匹配,其他任何值都表示不匹配。