Configuration

在 apache ServerAlias 指令中,問號是什麼意思?

  • February 9, 2016

Apache 的文件說:

如果合適,ServerAlias 可以包含萬用字元。

萬用字元 * 和 ? 可用於匹配名稱

我的同事聲稱問號與句點 ( .) 以外的任何字元匹配,因此可以在“單級”萬用字元中使用。我找不到任何支持這種用法的文件。

ServerAlias指令中,問號是什麼意思?請引用文件。

**問號 ( ?) 匹配單個字元,包括句點。**用於比較主機名和ServerAliases 的函式是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] != '\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

零是匹配,其他任何都不是。

你的同事是對的。?萬用字元確實用於匹配.對 dns 名稱有效的單個非字元。

您可以查看其他幾個提到該?字元的文件,如果他們描述了它的使用,他們總是會說“In a wild-card string, ? matches any single character, and * matches any sequences of characters. 不幸的是,我認為它只是被忽略了,到處都提到了這兩種語法的含義。

引用自:https://serverfault.com/questions/754369