Документация Apache говорит:
Если необходимо, ServerAlias может включать подстановочные знаки.
и
Подстановочные знаки * и? может использоваться для сопоставления имен
Мой коллега утверждает, что вопросительный знак соответствует любому символу, кроме точки (.
) и, таким образом, может использоваться в "одноуровневом" шаблоне. Я не могу найти никакой документации, подтверждающей это использование.
В ServerAlias
директива, что означает вопросительный знак? Приведите ссылку на документацию.
Ваш коллега прав. В ?
подстановочный знак действительно используется для сопоставления одного не .
символ допустимый для имен DNS.
Вы можете изучить несколько других документов, в которых упоминается ?
характер и если они описывают его использование они всегда говорят что-то вроде In a wild-card string, ? matches any single character, and * matches any sequences of characters.
К сожалению, я думаю, что о значениях обоих синтаксисов просто упустили из виду.
Знак вопроса (?
) соответствует одному символу, включая точку. Функция, используемая для сравнения имен хостов и 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
Ноль - это совпадение, все остальное - нет.