Em uma diretiva apache ServerAlias, o que significa um ponto de interrogação?

1

A documentação do Apache diz:

The ServerAlias may include wildcards, if appropriate.

e

The wildcard characters * and ? can be used to match names

Meu colega afirma que o ponto de interrogação corresponde a qualquer caractere que não seja um ponto final ( . ) e, portanto, pode ser usado em um curinga "de nível único". Não consigo encontrar nenhuma documentação que suporte esse uso.

Em uma diretiva ServerAlias , o que significa o ponto de interrogação? Por favor, cite documentação.

    
por Jared Beck 06.02.2016 / 00:00

2 respostas

0

O ponto de interrogação ( ? ) corresponde a um único caractere, incluindo um ponto final. A função usada para comparar nomes de host e ServerAlias es é ap_strcasecmp_match (server/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] != '
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
'); }

Supondo que faça sentido testar a função isoladamente, é fácil ver que o ponto de interrogação corresponde a caracteres únicos, incluindo pontos finais.

// 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] != '
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
'); }

Um zero é uma correspondência, qualquer outra coisa não é.

    
por 09.02.2016 / 03:05
1

Seu colega está correto. O caractere curinga ? é de fato usado para corresponder a um único caractere não . válido para nomes de DNS.

Você pode pesquisar vários outros documentos que mencionam o caracter ? , e se eles descrevem seu uso, eles sempre dizem algo como In a wild-card string, ? matches any single character, and * matches any sequences of characters. Infelizmente, eu acho que foi simplesmente esquecido de mencionar em todos os lugares os significados de ambas as sintaxes.

    
por 06.02.2016 / 00:07