应使用Nginx的if + return 301实现多域名统一收口到主域名,通过server_name配置所有域名,在server块中用if($host != "example.com")判断并return 301 https://example.com$request_uri,确保保留URI和参数,避免rewrite陷阱,并注意HTTPS证书覆盖及HTTP/HTTPS双归一。

要实现多个域名统一收口到一个主域名,Nginx 的 rewrite 模块配合 server_name 和 return(或 rewrite ... permanent)是最常用、最可靠的方式。核心思路是:对非主域名的请求,全部 301 重定向到目标主域名,同时保留原始 URI 和查询参数。
配置主 server 块监听所有相关域名
在 Nginx 配置中,定义一个 server 块,把所有需要合并的域名都写进 server_name,其中第一个为首选主域名(如 example.com),其余为旧域名或别名(如 www.example.com、example.net、www.example.net):
server {
listen 80;
server_name example.com www.example.com example.net www.example.net;
# 其他配置...
}这样该 server 块就能接收所有这些域名的请求,后续再判断是否需要跳转。
用 if + return 实现精准 301 跳转
在上述 server 块内,使用 if ($host != "example.com") 判断当前请求是否来自非主域名,然后用 return 301 强制跳转。这种方式简洁、安全、语义清晰,比 rewrite 更推荐:
-
return 301 https://example.com$request_uri;—— 强制跳转到 HTTPS 主域名,保留路径和参数 - 若需强制 HTTP,可写
return 301 http://example.com$request_uri; -
$request_uri自动包含完整路径和查询字符串(如/path?k=v),无需手动拼接
避免 rewrite 指令的常见陷阱
虽然题目提到 Rewrite 模块,但实际中应避免用 rewrite ^(.*)$ https://example.com$1 permanent; 这类写法,原因包括:
-
rewrite在location内使用易受匹配顺序影响,放在server级又可能干扰其他规则 -
$1依赖正则捕获,不如$request_uri稳定可靠 -
if在server块中用于简单 host 判断是 Nginx 官方明确允许的安全用法
HTTPS 场景下需额外注意证书和监听
如果主站启用 HTTPS,确保:
- SSL 证书覆盖所有被合并的域名(通配符证书或 SAN 多域名证书)
- 配置对应的
listen 443 sslserver 块,并同样加入if ($host != "example.com") { return 301 https://example.com$request_uri; } - HTTP server 块建议也存在,用于将所有 HTTP 请求 301 到 HTTPS 主域名,形成双重归一(协议 + 域名)


















