Nginx怎么配置多域名跳转 Nginx虚拟主机多站点配置详解

雨枫姑娘_6714

雨枫姑娘_6714

2026-05-02

759人浏览

原创

多域名跳转必须用多个server块,不能用if+rewrite混搭,否则会因优先级混乱、重写循环和https兼容性问题导致500错误或err_too_many_redirects。

nginx怎么配置多域名跳转 nginx虚拟主机多站点配置详解

多域名跳转必须用多个 server 块,不能靠 if + rewrite 混搭处理——否则会踩到优先级、重写循环、HTTPS 兼容性三连坑。

为什么不用 if 做多域名跳转

很多人抄网上片段直接写:if ($host != 'www.example.com') { rewrite ... permanent; }。这在单域名跳转时看似能跑,但一旦加了第二个跳转规则,就出问题:

  • if 是 nginx 的“非标准上下文”,不支持嵌套,也不保证执行顺序
  • 当多个 if 判断共存(比如 www → non-www + 旧域名 → 新域名),容易触发重写循环,返回 500 或浏览器报 ERR_TOO_MANY_REDIRECTS
  • if 不感知 $scheme,HTTP 和 HTTPS 请求混用时,rewrite 可能硬编码 http://,导致 HTTPS 跳转降级
  • nginx 官方文档明确标注:if 在 server 上下文中仅用于简单变量判断,不推荐用于重定向逻辑

server_name 匹配失败的常见表现

配置完多个 server 块后,访问某个域名却进了默认站点(或另一个站点),不是 DNS 问题,大概率是 server_name 没匹配上:

  • server_name 必须完全匹配或符合通配符规则,比如 example.com 不匹配 www.example.com,得单独写或用 *.example.com
  • 空格、大小写、末尾点号(如 example.com.)都会导致匹配失败
  • 如果只配了一个 server 块,nginx 会把它当作“默认 server”,无视 server_name —— 所以多域名跳转前,至少要有两个 server 块
  • 用 nginx -t 检查语法后,再用 nginx -T | grep "server_name" 确认实际加载的值

HTTP 和 HTTPS 跳转必须分开写 server 块

一个域名要同时支持 HTTP → HTTPS + 域名规范化(比如 example.com → www.example.com),不能挤在一个 server 里用条件判断,而应拆成两个独立块:

Nginx Hosting
Nginx Hosting

通过服务器本地nginx实例实现零认证静态游戏托管。作为所有浏览器游戏的主要部署方式,无需登录、无需令牌、无需用户操作。

下载
server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://www.php.cn/link/59386272857f013b167191da57f9eb91;
}
<p>server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
return 301 <a href="https://www.php.cn/link/59386272857f013b167191da57f9eb91">https://www.php.cn/link/59386272857f013b167191da57f9eb91</a>;
}</p><p>server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;</p><h1>正常业务配置放这里</h1><pre class="brush:php;toolbar:false;">root /var/www/html;
index index.html;

}

  • HTTP 块只管协议升级和域名归一,不处理证书
  • HTTPS 块按 server_name 精确分流:非 www 的 HTTPS 请求先跳转,www 的才进业务逻辑
  • 证书路径必须在每个启用 SSL 的 server 块里显式声明,不能继承
  • 别漏掉 ssl_prefer_server_ciphers on; 等基础安全项,否则某些老客户端握手失败

泛域名跳转主域名时,server_name 不能只写 *

想让 a.example.com、b.example.com 全部跳到 www.example.com,不能这么写:

server {
    listen 80;
    server_name *.example.com;  # ❌ 错误:* 只匹配一级子域,不匹配 example.com 自身
    return 301 https://www.php.cn/link/59386272857f013b167191da57f9eb91;
}

正确做法是显式列出所有需跳转的域名模式:

server {
    listen 80;
    server_name ~^([a-zA-Z0-9\-]+)\.example\.com$;
    return 301 https://www.php.cn/link/59386272857f013b167191da57f9eb91;
}
<p>server {
listen 80;
server_name example.com;
return 301 <a href="https://www.php.cn/link/59386272857f013b167191da57f9eb91">https://www.php.cn/link/59386272857f013b167191da57f9eb91</a>;
}</p>
  • 正则 server_name 必须以 ~ 开头,且注意转义点号(\.)
  • 泛匹配不覆盖主域名本身,example.com 得单独再写一个 server 块
  • 正则匹配性能略低于字面量,但对几十个子域来说无感;若子域超百,建议用 map 指令预处理
  • 测试正则是否生效,可临时加 add_header X-Matched-Host $host;,用 curl 看响应头

真正容易被忽略的是:跳转链不能跨协议又跨域名还带路径重写——比如从 http://old.com/path?a=1 跳到 https://new.net/other,$request_uri 就不该直接拼接,得手动截断或重构造,否则参数错位或路径污染。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

linux nginx

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
nginx 重启
nginx 重启

nginx重启对于网站的运维来说是非常重要的,根据不同的需求,可以选择简单重启、平滑重启或定时重启等方式。本专题为大家提供nginx重启的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.27

383

5

nginx 配置详解
nginx 配置详解

Nginx的配置是指设置和调整Nginx服务器的行为和功能的过程。通过配置文件,可以定义虚拟主机、HTTP请求处理、反向代理、缓存和负载均衡等功能。Nginx的配置语法简洁而强大,允许管理员根据自己的需要进行灵活的调整。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3287

6

nginx配置详解
nginx配置详解

NGINX与其他服务类似,因为它具有以特定格式编写的基于文本的配置文件。本专题为大家提供nginx配置相关的文章,大家可以免费学习。

2023.08.04

5965

6

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

561

5

nginx报404怎么解决
nginx报404怎么解决

当访问 nginx 网页服务器时遇到 404 错误,表明服务器无法找到请求资源,可以通过以下步骤解决:1. 检查文件是否存在且路径正确;2. 检查文件权限并更改为 644 或 755;3. 检查 nginx 配置,确保根目录设置正确、没有冲突配置等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.07.09

1476

5

Nginx报404错误解决方法
Nginx报404错误解决方法

解决方法:只需要加上这段配置:try_files $uri $uri/ /index.html;即可。想了解更多Nginx的相关内容,可以阅读本专题下面的文章。

2024.08.07

3938

3

nginx部署php项目教程汇总
nginx部署php项目教程汇总

本专题整合了nginx部署php项目教程汇总,阅读专题下面的文章了解更多详细内容。

2026.01.13

122

12

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

2026.01.13

437

23

Nginx跨平台安装实操指南:Windows、macOS与Linux环境快速搭建
Nginx跨平台安装实操指南:Windows、macOS与Linux环境快速搭建

本指南详解Nginx在Windows、macOS及Linux系统的安装全流程。涵盖官方包解压、Homebrew一键部署、APT/YUM源配置及Docker容器化方案。无论新手或开发者,均可快速搭建运行环境,掌握跨平台核心指令,为后续配置与调优奠定坚实基础。

2026.03.16

159

12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习