在 server_name 指令中用空格分隔多个域名是 Nginx 官方推荐的最标准、最可靠方式,支持精确匹配和合法通配符,无需 rewrite 或 if 判断;HTTPS 需证书 SAN 包含全部域名。

直接在 server_name 指令中列出多个域名,是最标准、最可靠的方式。Nginx 本身不叫“别名”,而是通过 server_name 支持多值匹配——只要请求头中的 Host 字段与其中任一值完全一致,该 server 块就会被选中处理请求。
在 server_name 中写多个域名
这是官方推荐做法,适用于所有 Nginx 版本,无需额外模块或复杂逻辑。
- 每个域名用空格分隔,不能用逗号、分号或引号包裹
- 支持精确匹配(
example.com)、带 www 的变体(www.example.com)、甚至二级域名(demo.example.net) - 通配符仅限开头或结尾的单星号,如
*.example.com或example.*,但不支持中间通配(ex*.com无效) - 示例配置片段:
server {
listen 80;
server_name example.com www.example.com demo.example.net;
root /var/www/my-site;
index index.html;
...
}HTTPS 站点必须统一证书覆盖所有域名
如果启用 HTTPS,SSL 证书必须包含全部 server_name 中列出的域名,否则浏览器会报安全警告。
- 使用 Let’s Encrypt 时,acme.sh 或 certbot 都支持 -d 参数一次性添加多个域名
- 例如:
certbot certonly --nginx -d example.com -d www.example.com -d demo.example.net - 证书的 Subject Alternative Name(SAN)字段需完整包含这些域名
避免常见误区
很多人误以为要靠 rewrite 或重定向来“绑定多个域名”,其实那是另一件事——用于强制跳转。而共用同一站点只需 server_name 多值即可。
- 不要把多个域名塞进一个
server_name的引号里,如server_name "example.com, www.example.com"—— 这会被当作单个字符串匹配,失效 - 不要依赖 location 或 if 判断 Host,既低效又易出错
- 若用宝塔面板,务必在「域名管理 → 添加域名别名」里逐行填写,而不是填在主域名输入框里
验证是否生效
配置保存后,执行 nginx -t 测试语法,再 nginx -s reload 生效。
- 用 curl 检查响应头:
curl -I -H "Host: demo.example.net" http://your-server-ip,应返回 200 并正确加载内容 - 浏览器访问各域名,确认页面一致、路径和参数正常保留
- 检查 access log,确认不同域名的请求都写入同一日志文件


















