如何用mod-rewrite与.htaccess分离主域名和子域名并实现跳转
搞定主域名与子域名分离的.htaccess配置方案
嘿,我看你在折腾mod-rewrite和.htaccess来分离主域名和子域名,还遇到了自己搜代码解决不了的问题,结合你给出的文件结构和需求,我给你整理一套靠谱的配置方案:
你的核心需求我再梳理一遍:
- 访问主域名(不管带不带www)时,直接跳转到其他域名
- 访问子域名时,要正确加载你
mainDomain/文件夹里的内容,或者执行对应的重定向
先看你的文件结构,很清晰:
public_html/ ├── .htaccess (主配置文件) ├── index.php (空文件) └── mainDomain/ ├── .htaccess (子域名专属配置) ├── index.php └── public/ └── .htaccess (public目录配置)
第一步:配置根目录的主.htaccess(public_html/.htaccess)
这个文件是核心,负责分流主域名和子域名的请求,直接复制下面的代码,记得替换成你自己的域名:
# 先开启重写引擎,这是所有规则的前提 RewriteEngine On RewriteBase / # 规则1:主域名(含www)直接跳转到目标域名 # 把example.com换成你的主域名,other-domain.com换成要跳转的目标域名 RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC] RewriteRule ^(.*)$ https://other-domain.com/$1 [L,R=301] # 规则2:子域名请求转发到mainDomain目录 # 把sub.example.com换成你的实际子域名 RewriteCond %{HTTP_HOST} ^sub\.example\.com$ [NC] RewriteRule ^(.*)$ mainDomain/$1 [L]
关键规则解释:
*[NC]*:忽略大小写,比如Example.Com也会被匹配到*R=301*:这是永久重定向,对SEO友好,测试的时候可以先改成*R=302*临时重定向,避免浏览器缓存错误规则*[L]*:表示这条规则匹配上之后,就不再执行后面的规则,防止规则冲突- 子域名的规则会把所有
sub.example.com/xxx的请求,转发到mainDomain/xxx,这样子域名就会加载你mainDomain里的文件,包括它自己的.htaccess
第二步:配置mainDomain里的.htaccess
如果你的子域名需要额外的规则(比如把请求都转发到public/目录),可以在这个文件里加配置,比如:
RewriteEngine On RewriteBase /mainDomain/ # 把所有非文件、非目录的请求转发到public目录 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ public/$1 [L]
必做的检查事项
别光复制代码,这几个点一定要确认:
- 你的Apache服务器必须启用了
mod_rewrite模块,Ubuntu/Debian可以用sudo a2enmod rewrite开启,然后重启Apache - 虚拟主机配置里的
AllowOverride必须设为All,否则.htaccess根本不会生效,配置大概是这样:<Directory /path/to/your/public_html> AllowOverride All </Directory> - 子域名的DNS要正确解析到你的服务器IP,而且虚拟主机要绑定子域名到
public_html目录(因为我们已经通过规则转发到mainDomain了)
排查小技巧
- 如果主域名没跳转:检查
HTTP_HOST的正则有没有写错,比如域名后缀、有没有漏写www\.的转义 - 如果子域名打不开:先确认DNS和虚拟主机绑定没问题,然后看主.htaccess的子域名规则有没有写错
- 出现循环重定向:大概率是规则冲突,检查
*[L]*标志有没有加,或者子域名的规则是不是不小心匹配到了主域名
内容的提问来源于stack exchange,提问作者m3T3HaN
相关产品推荐
相关产品推荐

