Apache子域名重定向核心是用RewriteCond精准判断协议和主机名,避免循环:必须同时满足“HTTPS关闭”且“Host不匹配目标子域”才执行RewriteRule跳转,否则易触发Too Many Redirects错误。

Apache URL 重写实现子域名重定向,核心在于用 RewriteCond 精准判断当前请求是否已满足目标状态(如正确子域名 + 正确协议),再用 RewriteRule 执行跳转。盲目重定向而不加条件,极易触发“Too Many Redirects”错误。
明确重定向目标和触发条件
先想清楚:你要把谁重定向到哪里?常见场景包括:
- 所有 HTTP 请求强制跳转到
sub.example.com(且保持 HTTPS) - 非
www的主域名请求统一跳到www.example.com - 特定路径(如
/admin)只允许通过admin.example.com访问
每种情况都必须定义两个关键条件:协议(%{SERVER_PORT} 或 %{HTTPS})和主机名(%{HTTP_HOST})。
正确写法:用 Host 判断避免循环
错误示例(无 Host 判断):
RewriteCond %{SERVER_PORT} 80<br>RewriteRule ^(.*)$ http://sub.example.com/$1 [R=301,L]
问题:只要走 HTTP 80 端口,不管是不是 sub.example.com,都会跳转——包括跳转后再次进来的请求,形成死循环。
✅ 正确写法(加 Host 排除):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
RewriteEngine On<br>RewriteCond %{HTTPS} off<br>RewriteCond %{HTTP_HOST} !^sub\.example\.com$ [NC]<br>RewriteRule ^(.*)$ https://sub.example.com/$1 [R=301,L]
说明:
• 第二行检查是否未启用 HTTPS;
• 第三行确保当前 Host 不是目标子域名(!^... 表示“不匹配”);
• 只有同时满足“非 HTTPS”且“非目标子域名”时才执行跳转。
HTTPS + 子域名统一跳转(推荐组合)
生产环境更常见的是强制 HTTPS + 指定子域名。可合并判断,逻辑更清晰:
RewriteEngine On<br>RewriteCond %{HTTPS} off [OR]<br>RewriteCond %{HTTP_HOST} !^sub\.example\.com$ [NC]<br>RewriteRule ^(.*)$ https://sub.example.com/$1 [R=301,L]
注意:
• [OR] 表示“或”关系,即“没开 HTTPS”或“Host 不对”,任一成立就跳转;
• 这样能覆盖 HTTP 访问、HTTPS 但 Host 错(比如直接 IP 或其他子域名)等全部异常入口;
• 目标地址统一用 https://,避免二次跳转。
验证与调试技巧
配置后务必验证,避免上线出错:
- 用
curl -I http://example.com和curl -I https://sub.example.com查看响应头中的Location和状态码(应为 301) - 浏览器开发者工具 → Network 标签,刷新页面,观察跳转链是否只有一次 301
- 临时把
[R=301]改成[R=302]测试,避免缓存干扰 - 确保
.htaccess所在目录的 Apache 配置允许重写(AllowOverride All)且mod_rewrite已启用

















