如何使用RewriteMap将域名重定向至对应子域名?
正确的RewriteMap域名重定向配置方案
前提注意
RewriteMap指令不能直接放在.htaccess文件中,必须配置在Apache主配置文件(httpd.conf)或虚拟主机配置(vhost.conf)内,否则会触发服务器错误。先确保你已经在全局配置中添加了:
RewriteMap domainMap txt://path/to/map.txt
以下是实现需求的.htaccess完整配置:
Options +FollowSymLinks -MultiViews RewriteEngine On # 将外部域名(含www前缀)重定向到map.txt对应的子域名 RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC] # 检查当前域名在map.txt中是否存在匹配条目 RewriteCond ${domainMap:%1|NOT_FOUND} !NOT_FOUND # 执行重定向,保留原请求路径,使用301永久重定向 RewriteRule ^ https://${domainMap:%1}%{REQUEST_URI} [L,R=301]
配置细节解释
- 域名提取:
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$会自动去掉域名的www.前缀,提取核心域名部分(比如www.exmple.com提取为exmple.com,test.com直接保留为test.com)。 - 匹配校验:
${domainMap:%1|NOT_FOUND}表示如果%1(提取的核心域名)在map中无匹配,则返回NOT_FOUND,这条规则确保只有map中存在的域名才会触发重定向,避免无匹配时出现异常。 - 完整重定向:
%{REQUEST_URI}会保留原请求的路径,比如访问exmple.com/about会直接重定向到mm.site.com/about;R=301为永久重定向,若需要临时重定向可改为R=302。
你原有配置的问题点
- 第一条规则逻辑倒置:你原本的规则是匹配
*.site.com的子域名去查找映射,和“外部域名重定向到子域名”的需求完全相反。 - 第二条规则未实现跳转:这条规则是将请求转发到服务器内部的
/%1/$1路径,并非跳转到目标子域名,不符合重定向的需求。
内容的提问来源于stack exchange,提问作者Ziad Nassar
相关产品推荐
相关产品推荐

