Apache RewriteCond 配合 RewriteRule 实现域名重写,核心是通过匹配 %{HTTP_HOST} 变量判断访问域名并执行跳转或内部重写,支持统一主站、多域名共用、子域名排除及环境变量灵活控制,需注意点号转义、条件逻辑、捕获引用和调试规范。

Apache 的 RewriteCond 配合 RewriteRule 实现域名重写,核心是通过匹配 %{HTTP_HOST} 变量来判断访问的域名,再决定是否执行重定向或内部重写。
匹配特定域名并强制跳转到主站
比如把 www.example.com 和 example.com 统一跳转到 https://example.com(不带 www):
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
<p>RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ <a href="https://www.php.cn/link/03b2fa7f90c700a4636686f4484c50e4">https://www.php.cn/link/03b2fa7f90c700a4636686f4484c50e4</a> [R=301,L]说明:
• [NC] 表示忽略大小写;
• %{HTTP_HOST} 是请求头中的主机名(不含协议和端口);
• 第二段条件检查 HTTPS 是否关闭,确保全站强制 HTTPS。
多域名指向同一站点但保留原始域名
如果多个域名(如 site-a.com、site-b.net)都解析到同一虚拟主机,又不想跳转,只是让它们共用同一套代码,通常不需要重写——但若需记录来源域名或做路由区分,可用条件标记:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
RewriteCond %{HTTP_HOST} ^(site-a\.com|site-b\.net)$ [NC]
RewriteRule ^(.*)$ /index.php?domain=%{HTTP_HOST} [QSA,L]这样 PHP 脚本可通过 $_GET['domain'] 获取当前访问域名,便于动态加载配置。
排除某个子域名不做重写
比如主站 example.com 要 301 跳转到 HTTPS,但 dev.example.com 需要保持 HTTP 测试用:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^example\.com$ [NC,OR]
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://www.php.cn/link/03b2fa7f90c700a4636686f4484c50e4 [R=301,L]
<p>RewriteCond %{HTTP_HOST} ^dev.example.com$ [NC]
RewriteRule ^ - [E=NOHTTPS:1]</p><h1>后续规则可基于环境变量跳过 HTTPS 强制</h1><p>RewriteCond %{ENV:NOHTTPS} !=1
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ <a href="https://www.php.cn/link/03b2fa7f90c700a4636686f4484c50e4">https://www.php.cn/link/03b2fa7f90c700a4636686f4484c50e4</a> [R=301,L]技巧:用 [E=KEY:VALUE] 设置环境变量,再用 %{ENV:KEY} 判断,实现灵活排除。
常见陷阱与注意事项
• 域名中的点 . 必须转义为 \.,否则会被正则当作通配符;
• RewriteCond 默认是“且”关系,多个条件连续写表示全部满足才触发;用 [OR] 标志可改为“或”;
• RewriteRule 的 $1 引用的是 ^ 捕获的路径,不是域名;
• 测试时先用 R=302(临时跳转),确认无误再改 R=301,避免浏览器缓存导致调试困难;
• 确保 RewriteEngine On 在规则前启用,且 Apache 已加载 mod_rewrite 模块。

















