Назад | Перейти на главную страницу

Что означает вопросительный знак в директиве apache ServerAlias?

Документация Apache говорит:

Если необходимо, ServerAlias ​​может включать подстановочные знаки.

и

Подстановочные знаки * и? может использоваться для сопоставления имен

Мой коллега утверждает, что вопросительный знак соответствует любому символу, кроме точки (.) и, таким образом, может использоваться в "одноуровневом" шаблоне. Я не могу найти никакой документации, подтверждающей это использование.

В ServerAlias директива, что означает вопросительный знак? Приведите ссылку на документацию.

Ваш коллега прав. В ? подстановочный знак действительно используется для сопоставления одного не . символ допустимый для имен DNS.

Вы можете изучить несколько других документов, в которых упоминается ? характер и если они описывают его использование они всегда говорят что-то вроде In a wild-card string, ? matches any single character, and * matches any sequences of characters. К сожалению, я думаю, что о значениях обоих синтаксисов просто упустили из виду.

Знак вопроса (?) соответствует одному символу, включая точку. Функция, используемая для сравнения имен хостов и ServerAliases это 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

Ноль - это совпадение, все остальное - нет.