Nginx 多域名重定向归集主域名需用多个独立 server 块:HTTP(80端口)统一 301 跳转至 https://www.example.com;HTTPS(443端口)拆分为非主域名跳转和主域名服务两个 server 块,各配独立 SSL 证书;server_name 必须显式列出、全小写、无多余符号;加 default_server 兜底并 return 444 防暴露。

Nginx 在 Virtual Host 中实现多域名重定向归集到主域名,核心是用多个独立的 server 块分别处理不同跳转场景,而不是用 if + rewrite 混搭——后者极易引发重写循环、HTTPS 降级或 500 错误。
下面分几个关键环节讲清楚怎么配才稳、才对:
多域名 HTTP 跳转统一归集(80 端口)
这是最基础也最常用的一环:把所有旧域名、带 www 的、不带 www 的,全部 301 跳到一个主域名(比如 https://www.example.com)。
server {
listen 80;
server_name example.com www.example.com old-site.com sub.example.com;
return 301 https://www.example.com$request_uri;
}-
server_name后面可空格列出所有需要跳转的域名; -
return 301比rewrite更高效、更安全,Nginx 官方推荐用于简单重定向; -
$request_uri保留原始路径和查询参数,用户访问/about?ref=1会跳到https://www.example.com/about?ref=1。
HTTPS 下的域名规范化(443 端口需拆开写)
HTTP 和 HTTPS 必须分开写 server 块。不能在一个 server 里用 if ($scheme = http) 判断——这又掉进 if 坑里了。
正确做法是:
# 非主域名的 HTTPS 请求 → 主域名 HTTPS
server {
listen 443 ssl;
server_name example.com old-site.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
return 301 https://www.example.com$request_uri;
}
# 主域名的 HTTPS 正常服务
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
root /var/www/example;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}- 每个
server_name只写它“专管”的域名,避免匹配冲突; - SSL 证书路径必须真实存在,且每个
server块都要单独配置(哪怕证书文件相同); -
example.com和www.example.com不能挤在同一个server里做条件跳转,否则 HTTPS 下容易因$scheme不一致导致跳转失败或降级。
防止 server_name 匹配失败的实操细节
很多跳转没生效,其实不是逻辑错,而是 server_name 没对上:
-
example.com≠www.example.com,必须显式写出或用通配符*.example.com(注意通配符不匹配根域); - 域名末尾多了一个点(如
example.com.)会导致匹配失败; - 配置里有空格、大小写混用(如
EXAMPLE.COM),Nginx 默认区分大小写,建议全小写; - 如果只写了一个
server块,Nginx 会把它当默认server,无视server_name—— 所以至少要有两个server块,才能触发域名匹配逻辑。
验证方式:
nginx -t && nginx -T | grep "server_name"
看实际加载的 server_name 是否和你写的完全一致。
补充:默认 server 处理未匹配请求(防意外暴露)
加一个兜底 server,专门捕获所有没被明确 server_name 匹配的请求(比如直接用 IP 访问、拼错的域名):
server {
listen 80 default_server;
listen 443 ssl default_server;
server_name _;
ssl_certificate /path/to/placeholder.crt;
ssl_certificate_key /path/to/placeholder.key;
return 444; # 直接关闭连接,比返回错误页更安全
}-
default_server标识这个块是“兜底”角色; -
server_name _是 Nginx 的通配占位符,不匹配任何真实域名; -
return 444是静默拒绝,避免泄露服务器信息。
这样一套配置下来,所有非主域名请求都会干净、安全、无循环地归集到 https://www.example.com,同时兼顾 SEO 友好性和 HTTPS 安全性。


















