nginx 选择虚拟主机时,server_name 的匹配顺序遵循精确匹配、通配符前缀、通配符后缀、正则表达式以及默认匹配的优先级规则。具体做法是 nginx 按上述优先级从高到低进行匹配,一旦找到第一个符合条件的 server 块即停止搜索并返回该配置。若存在多个同优先级的匹配项,则依据配置文件中的出现顺序决定最终选用的虚拟主机。

精确匹配与通配符前缀哪个优先级更高
精确匹配的优先级高于通配符前缀。当请求的 Host 头同时符合精确名称和通配符前缀时,Nginx 会优先选择精确匹配的那个 server 块。例如,请求 www.example.com 时,如果配置中既有 server_name www.example.com; 又有 server_name *.example.com;,Nginx 会选择前者。

server {
listen 80;
server_name www.example.com;
root /var/www/precise;
}
server {
listen 80;
server_name *.example.com;
root /var/www/wildcard;
}
在上述配置中,访问 www.example.com 将使用 /var/www/precise 目录,因为精确匹配优先级更高。而访问 blog.example.com 则会命中通配符前缀,使用 /var/www/wildcard 目录。
通配符后缀与正则表达式的匹配逻辑
通配符后缀的优先级高于正则表达式。当请求的 Host 头同时符合通配符后缀和正则表达式模式时,Nginx 会优先选择通配符后缀。正则表达式仅在无法通过精确、前缀或后缀匹配找到合适 server 块时才被考虑。此外,正则表达式的匹配是按配置文件中出现的顺序进行的,第一个匹配的正则表达式将被选中。

server {
listen 80;
server_name ~^www\.(.*)$;
root /var/www/regex;
}
server {
listen 80;
server_name ~*\.example\.com$;
root /var/www/regex2;
}
在上述配置中,如果请求 www.test.com,它将首先尝试匹配通配符后缀(无匹配),然后尝试正则表达式。由于第一个正则表达式 ~^www\.(.*)$ 匹配成功,因此使用 /var/www/regex 目录。如果请求 test.example.com,它不会匹配第一个正则,但会匹配第二个,因此使用 /var/www/regex2 目录。
未匹配任何 server_name 时的默认行为是什么
当请求的 Host 头不匹配任何配置的 server_name 时,Nginx 会选择监听该端口的第一个 server 块作为默认虚拟主机。这个默认行为确保了即使没有显式配置默认 server,请求也不会被拒绝,而是由第一个定义的 server 块处理。可以通过在任意 server 块中设置 server_name _; 来显式指定默认虚拟主机,其中 _ 是一个特殊的占位符,表示匹配所有未明确指定的域名。











