Nginx按优先级选择server块:完全匹配>通配符前缀>通配符后缀>正则匹配(按配置顺序取首个成功),未命中时启用显式default_server,否则取同端口第一个server块。
Nginx 在多个 server 块中选择匹配项,不依赖定义顺序,也不默认选第一个,而是依据一套明确的匹配优先级规则。核心逻辑是:先筛选出所有可能匹配的 server 块,再从中选出最精确匹配的那个。
Nginx 会按以下顺序逐级比对 server_name 指令(注意:端口和协议也参与初始筛选,但 server_name 是关键区分字段):
server_name example.com; → 请求 Host: example.com)server_name *.example.com; → 匹配 www.example.com,但不匹配 example.com 或 sub.www.example.com)server_name www.*; → 匹配 www.test,但不匹配 test.www)~ 或 ~* 开头,区分大小写/不区分大小写)——正则匹配在所有文字匹配之后执行,且按配置文件中出现顺序取第一个成功匹配
如果以上都未命中,Nginx 会 fallback 到 默认 server:
default_server 的 server 块(在 listen 指令后加 default_server,例如 listen 80 default_server;)default_server,则取同一监听地址+端口下第一个出现的 server 块(这是唯一依赖定义顺序的情形,仅用于兜底)不同 listen 配置(如 listen 80; 和 listen 443 ssl;)互不影响。只有监听相同 IP:Port(及相同协议、ssl 标志等)的 server 块才会被纳入本次请求的匹配池。
例如:
server { listen 80; server_name a.com; }server { listen 80 default_server; server_name b.com; }server { listen 443 ssl; server_name a.com; }
→ HTTP 请求到 80 端口时,只在前两个 server 中选;HTTPS 请求则只看第三个。
default_server,避免隐式依赖顺序server_name 冲突(比如重复的完全匹配或重叠通配符)nginx -t 测试配置,再用 nginx -T 查看实际生效的 server 块解析顺序return 200 "Served by: $server_namen"; 辅助验证实际路由目标不复杂但容易忽略