nginx按端口先行、域名定块两层规则选择server块:先筛选监听目标端口的候选块,再依精确匹配、前导通配符、后缀通配符、正则匹配顺序比对server_name;无匹配时由default_server或首个server块兜底,证书绑定取决于server_name匹配结果。

Nginx 选择哪个 server 块处理请求,不是看配置顺序,而是严格按两层规则:先筛端口,再比 server_name。核心逻辑是“端口先行、域名定块”。
第一步:按 listen 端口筛选候选 server 块
请求进来后,Nginx 首先检查目标端口(如 80 或 443),只保留所有监听该端口的 server 块;其他端口的配置直接排除。例如:
-
listen 80;的块不参与 HTTPS 请求匹配 -
listen 443 ssl;和listen 443;是两个独立池子,互不干扰 -
listen 192.168.1.10:80;只响应发往该 IP 的请求,和listen *:80;分属不同上下文
第二步:在候选块中按 server_name 优先级精确匹配
同一端口下的 server 块,按以下固定顺序逐级比对 Host 头(不区分大小写):
-
精确匹配最高优先:比如
server_name example.com;只匹配Host: example.com,不匹配www.example.com或example.com:8080 -
最长前导通配符次之:如
server_name *.example.com;匹配api.example.com、www.example.com,但不匹配example.com;注意www.*.com是非法写法 -
最长后缀通配符再次之:如
server_name example.*;(Nginx 1.11.10+ 支持),匹配example.org、example.net -
正则匹配最后执行:以
~或~*开头,按配置文件从上到下找第一个成功项,命中即停;不参与“长度比较”,只看是否匹配
兜底行为:default_server 决定 fallback 路径
当 Host 头无法匹配任何 server_name 时:
- 若存在
listen 443 ssl default_server;这类显式标记,则无条件使用该块 - 若未设
default_server,Nginx 会启用该端口下**第一个定义的server块**(按配置加载顺序),这容易引发误响应 - 建议单独配置一个最小化默认块,返回 444(关闭连接)或 404,避免信息泄露
证书与 server_name 绑定关系
SSL 证书本身没有优先级,它只是被“挂载”在某个 server 块里。真正起作用的是 server_name 匹配结果:
- 通配符证书(如
*.example.com.crt)必须放在server_name *.example.com;的块中才生效 - 具体域名证书(如
www.example.com.crt)必须对应server_name www.example.com; - 客户端 SNI 字段决定 Nginx 把哪个
server块选出来,之后就直接发送该块配置的证书











