用return 301可高效合并多级域名,需统一在listen 80的server块中配置所有旧域名,跳转至固定https主域名并保留$request_uri;正则匹配适用于大量子域名,配置后须nginx -t验证并curl测试响应头。

直接用 return 301 指令就能高效完成多级域名合并,核心是让多个旧域名(比如 example.com、www.example.com、blog.example.com)全部跳转到一个主域名(如 www.example.com),同时保留路径和参数。
明确 server_name 并统一监听 80 端口
只在一个 server 块里处理所有需跳转的域名,避免分散配置导致遗漏或冲突:
-
server_name后列出所有要合并的旧域名,空格分隔 -
listen 80是必须的,这是用户首次访问 HTTP 的入口 - 不要在
listen 443 ssl的块里加跳转,否则可能引发循环
示例配置:
server {
listen 80;
server_name example.com www.example.com blog.example.com shop.example.com;
return 301 https://www.example.com$request_uri;
}
协议与目标地址写法要稳妥
- 如果新站全站强制 HTTPS,建议直接写
https://而非$scheme://-
$scheme在 HTTP 请求下会生成http://,若新站不支持 HTTP 就会失败
-
- 目标域名不要依赖
$host或$server_name,尤其当有泛解析或未绑定域名访问时,它们可能为空或不可控 -
$request_uri必须保留,它自动带上原始路径和查询参数(如/login?next=/admin)
多级子域名合并的常见模式
比如要把 a.example.com、b.example.com、c.example.com 都归到 www.example.com:
- 不需要每个子域名单独配一个
server块 - 可用正则匹配简化写法(适合大量子域名):
server { listen 80; server_name ~^(?<sub>.+)\.example\.com$; return 301 https://www.example.com$request_uri; }</sub>注意:这种写法要求
sub变量仅用于识别,跳转目标仍是固定主域名,避免因$sub不稳定导致跳错。
配置后必须验证
- 运行
nginx -t检查语法,再nginx -s reload生效 - 用
curl -I http://example.com/test?x=1查看响应头:- 状态码应为
HTTP/1.1 301 Moved Permanently -
Location头应为https://www.example.com/test?x=1
- 状态码应为
- 浏览器测试时清缓存,301 一旦生效就会被长期缓存,测试阶段可临时改
302验证逻辑
不复杂但容易忽略细节。











