在 apache ServerAlias 指令中,问号代表什么意思?

在 apache ServerAlias 指令中,问号代表什么意思?

Apache 的文档说:

如果合适,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

零表示匹配,其他任何值都表示不匹配。

相关内容