apache中用rewritecond配合%{http_host}匹配域名,核心是准确提取请求头host字段值(如www.example.com),通过正则锚定^$、转义点号.、加[nc]忽略大小写,并结合and/or逻辑控制跳转或重写。

Apache 中用 RewriteCond 配合 %{HTTP_HOST} 匹配域名,核心是准确提取请求头里的主机名(如 www.example.com 或 example.com),再通过正则表达式判断是否执行后续重写或跳转。关键在写法严谨、转义到位、逻辑清晰。
基础写法与注意事项
%{HTTP_HOST} 是大小写敏感的字符串变量,值来自 HTTP 请求头的 Host 字段,不含协议、端口(除非显式带端口如 example.com:8080),也不含路径。使用时需注意:
- 点号
.必须转义为\.,否则匹配任意字符 - 开头和结尾建议用
^和$锚定,避免部分匹配(例如example.com错误匹配到myexample.com) - 加
[NC]可忽略大小写,适合兼容用户手动输入大写域名的情况 - 条件必须写在对应
RewriteRule之前,且每条RewriteCond默认是 AND 关系
常见匹配场景与写法示例
根据实际需求选择对应模式:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 精确匹配某个域名(含 www):
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC] - 匹配主域名(不含 www):
RewriteCond %{HTTP_HOST} ^example\.com$ [NC] - 匹配带或不带 www 的同一站点:
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC] - 匹配多个不同域名(用
[OR]连接):RewriteCond %{HTTP_HOST} ^old1\.com$ [NC,OR]<br>RewriteCond %{HTTP_HOST} ^old2\.org$ [NC]<br>RewriteRule ^(.*)$ https://new.com/$1 [R=301,L] - 排除特定域名(如只对非主站生效):
RewriteCond %{HTTP_HOST} !^example\.com$ [NC]
结合 RewriteRule 实现跳转或重写
匹配成功后,RewriteRule 中可引用 %{HTTP_HOST} 或捕获组,实现灵活跳转:
- 统一跳转到无 www 主站:
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]<br>RewriteRule ^(.*)$ https://example.com/$1 [R=301,L] - 保留子域名结构,仅去除 www:
RewriteCond %{HTTP_HOST} ^www\.([a-z0-9\-]+\.[a-z]{2,})$ [NC]<br>RewriteRule ^(.*)$ https://%1$1 [R=301,L](%1 是子域名+主域,如blog.example.com) - 将所有非主站域名 301 跳转到主站:
RewriteCond %{HTTP_HOST} !^example\.com$ [NC]<br>RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
防循环与调试建议
错误配置容易引发重定向循环(比如跳转目标又被条件匹配):
- 跳转前加判断,确保目标域名不触发自身规则,例如:
RewriteCond %{HTTP_HOST} !^example\.com$ [NC]再执行跳向example.com的规则 - 调试时可用
R=302临时跳转,避免浏览器缓存 301 导致难排查 - Apache 2.4 推荐开启
LogLevel alert rewrite:trace3查看重写过程;2.2 可用RewriteLog(已弃用) - 测试时注意 Host 头是否被代理或 CDN 修改——某些 CDN 会覆盖原始
Host,此时需配合%{HTTP:X-Forwarded-Host}等自定义头(需确认可信来源)










