Nginx 配置 Virtual Host 跳转需用独立 server 块按域名、协议、端口精准分流,优先用 return 301/302 实现跳转,严禁 if 混搭;HTTP 与 HTTPS 必须物理分离,server_name 匹配要严谨,SSL 证书须在对应块中正确配置。

在 Nginx 中配置 Virtual Host 跳转,核心是用多个 server 块按域名、协议、端口精准分流,再用 return 或 rewrite 实现跳转。不能靠 if 判断混搭多个跳转逻辑,否则极易触发重定向循环或 HTTPS 降级。
必须用独立 server 块区分不同跳转目标
每个跳转场景(比如旧域名→新域名、HTTP→HTTPS、www→非 www)都应单独写一个 server 块,由 server_name 和 listen 共同决定匹配路径:
- HTTP 跳 HTTPS:单独写一个监听
80端口的块,return 301 https://... - HTTPS 下的域名规范化(如 example.com → www.example.com):另写一个监听
443 ssl的块,server_name example.com,再return 301 https://www.example.com$request_uri - 多个旧域名跳同一新域名:每个旧域名单独配一个
server块,避免共用if导致优先级错乱
优先用 return 而不是 rewrite 做跳转
return 指令直接返回状态码和目标地址,性能高、语义清晰、无重写循环风险:
-
return 301 https://new-site.com$request_uri;—— 永久跳转,对 SEO 友好 -
return 302 https://promo.new-site.com$request_uri;—— 临时跳转,适合活动页切换 - 注意:
$request_uri保留原始路径和查询参数;若只需跳首页,可写成/
server_name 匹配要严谨,避免漏配或误配
Nginx 按完全匹配或最长通配符规则选择 server 块,常见坑点:
-
server_name example.com;不匹配www.example.com,需显式列出:server_name example.com www.example.com; - 支持通配符:
*.example.com匹配所有子域名,example.*不合法(只允许前导星号) - 大小写不敏感,但开头/结尾空格、多余点号(如
example.com.)会导致匹配失败 - 运行
nginx -T | grep server_name查看实际加载的值,确认无拼写误差
HTTP 和 HTTPS 跳转必须物理分离
不能在一个 server 块里用 if ($scheme = http) 做判断——$scheme 在 SSL 握手前不可靠,且 if 在 server 上下文中行为不稳定:
- 监听 80 端口的块只处理 HTTP 请求,统一
return 301 https://... - 监听 443 ssl 的块只处理 HTTPS 请求,各自按
server_name区分跳转目标 - SSL 证书必须在对应
server块中正确配置ssl_certificate和ssl_certificate_key,否则 443 块无法生效


















