一个Nginx server块可绑定多个域名,核心是server_name后用空格分隔各域名,支持精确匹配、通配符和正则,HTTPS需SAN证书覆盖全部域名,并通过$host变量识别实际访问域名。

一个 Nginx server 块可以轻松绑定多个域名,核心是用 server_name 指令列出所有合法的主机名,Nginx 会根据请求头中的 Host 字段自动匹配。
基础写法:空格分隔多个域名
最常用也最直观的方式是在 server_name 后面用空格依次写上所有要绑定的域名:
server {
listen 80;
server_name example.com www.example.com demo.site app.demo.site;
<pre class="brush:php;toolbar:false;">location / {
root /var/www/html;
index index.html;
}}
注意:
- 域名之间用空格分隔,**不能用逗号或分号**;
- 支持精确匹配(example.com)、通配符(*.example.com)和正则(以 ~ 开头);
- 如果有泛域名需求,比如同时支持 www.example.com 和 blog.example.com,可写成 server_name example.com *.example.com;。
处理带 www 和不带 www 的跳转(可选但推荐)
为避免 SEO 重复内容或用户访问混乱,建议统一主域名。常见做法是把带 www 的请求 301 重定向到不带 www(或反之):
# 重定向 www 到根域名
server {
listen 80;
server_name www.example.com;
return 301 https://example.com$request_uri;
}
<p>server {
listen 80;
server_name example.com;</p><h1>主配置放这里</h1><p>}HTTPS 环境下同理,只需把 listen 80 换成 listen 443 ssl 并配上证书即可。
同一 IP 绑定多个独立站点?用多个 server 块
如果不同域名要指向不同网站目录(比如 siteA.com 和 siteB.net),不能共用一个 server 块,而应分别定义:
server {
listen 80;
server_name siteA.com www.siteA.com;
root /var/www/siteA;
index index.html;
}
<p>server {
listen 80;
server_name siteB.net www.siteB.net;
root /var/www/siteB;
index index.html;
}Nginx 会按 Host 头精确匹配对应的 server 块,互不影响。
验证与调试小技巧
- 改完配置后务必运行
nginx -t检查语法是否正确; - 用
curl -H "Host: xxx.com" http://your-server-ip模拟不同域名请求,确认是否命中预期 server 块; - 日志中可通过
$host变量记录实际匹配的域名,方便排查; - 若用 CDN 或反向代理,确保源站收到的
Host头未被篡改(必要时用proxy_set_header Host $host;显式透传)。


















