Nginx 中 server_name 唯一标识站点的关键是确保所有 server 块中该指令的域名组合不重复且精准匹配 Host 头;需明确声明主域名与别名、避免通配符/正则误匹配、设 default_server 兜底、按文件隔离配置并用 nginx -t 和 nginx -T 验证。
要让 Nginx 在 Virtual Host 中用 server_name 唯一标识一个站点,关键不是“只写一个域名”,而是确保该 server_name 的组合在所有 server 块中不重复,并能准确匹配实际请求的 Host 头。
一个站点通常有主域名(如 example.com)和常见变体(如带 www 的 www.example.com)。把这些都写进同一个 server_name 指令,用空格分隔:
server_name example.com www.example.com;server 块不能也用这两个域名通配符(如 *.example.com)或正则(如 ~^www.(.+)$)虽灵活,但容易意外匹配到本不该归入该站点的请求:
site1.example.com 和 site2.example.com 两个独立站点,就不要用 *.example.com 统一匹配~^api.example.com$ 比 ~^api. 更安全当请求的 Host 头不匹配任何 server_name,Nginx 会交给第一个监听相同端口的 server 块处理——这可能导致误响应。显式指定默认站点更可控:
server 块中加上 listen 80 default_server;
server_name 可留空或设为 "",但必须有 default_server 标志Nginx 按字典序读取 /etc/nginx/conf.d/*.conf,若多个配置文件里出现相同 server_name,后加载的会覆盖前一个,但实际行为取决于匹配优先级,易引发不可预期路由:
example.com.conf),文件名不含特殊字符nginx -t 验证语法,再用 nginx -T | grep "server_name" 查看最终生效的全部 server_name 列表