nginx配置中的服务器名称
通常,在nginx的配置节中:
server { listen 80; server_name example.org www.example.org; ... }
server_name(服务器名称) 指令定义确定哪个服务器块用于给定请求。可以使用确切名称、通配符名称、ip地址或正则表达式来定义它们:
server { listen 80; server_name example.org www.example.org; ... } server { listen 80; server_name *.example.org; ... } server { listen 80; server_name mail.*; ... } server { listen 80; server_name ~^(?<user>.+)\.example\.net$; ... }
按名称搜索虚拟服务器时,如果 name 与多个 指定的变体,例如通配符名称和正则表达式都匹配, 将按以下优先顺序选择第一个匹配的变体:
- 精确名称
- 以星号开头的最长通配符名称,例如
*.example.org
- 以星号结尾的最长通配符名称,例如
mail.*
- 第一个匹配的正则表达式 (按在配置文件中出现的顺序)
正则表达式名称
nginx 使用的正则表达式与使用的正则表达式兼容 通过 Perl 编程语言 (PCRE)。 要使用正则表达式,服务器名称必须以波浪号 字符:
server_name ~^www\d+\.example\.net$;
否则,它将被视为确切名称,或者如果表达式包含 星号,作为通配符名称(很可能是无效名称)。 不要忘记设置 “” 和 “” 锚点。 它们不是语法上的要求,而是逻辑上的要求。 另请注意,域名点应使用反斜杠进行转义。 包含字符 “” 的正则表达式 和 “” 应引用:^
$
{
}
server_name "~^(?<name>\w\d{1,3}+)\.example\.net$";
否则 nginx 将无法启动并显示错误消息:
directive "server_name" is not terminated by ";" in ...
命名正则表达式捕获稍后可用作变量:
server {
server_name ~^(www\.)?(?<domain>.+)$;
location / {
root /sites/$domain;
}
}
PCRE 库使用以下语法支持命名捕获:
?<
name
>Perl 5.10 兼容语法,自 PCRE-7.0 起支持 ?'
name
'Perl 5.10 兼容语法,自 PCRE-7.0 起支持 ?P<
name
>Python 兼容语法,自 PCRE-4.0 起支持
如果 nginx 启动失败并显示错误消息:
pcre_compile() failed: unrecognized character after (?< in ...
这意味着 PCRE 库是旧的,并且语法 应该改为尝试 “”。 捕获也可以以数字形式使用:?P<
name
>
server {
server_name ~^(www\.)?(.+)$;
location / {
root /sites/$2;
}
}
但是,这种用法应仅限于简单的情况(如上所示), 因为数字参考很容易被覆盖。