如何通过.htaccess将子域名内容映射至对应子目录?
子域名映射到对应子目录的.htaccess解决方案
嘿,这个需求完全可以用Apache的mod_rewrite配合.htaccess实现,我帮你一步步捋清楚具体怎么做:
前提条件
首先得确保你的服务器满足两个基础条件:
- 已经开启了
mod_rewrite模块(大部分主流主机默认都开启了,不确定的话可以查phpinfo或者咨询主机商) - 网站根目录的.htaccess文件拥有重写权限(也就是Apache配置里
AllowOverride设置为All)
核心.htaccess规则
把下面的代码放到网站根目录的.htaccess文件里,记得把example.com替换成你自己的主域名:
RewriteEngine On # 排除主域名和www子域名(可选,根据你的需求调整) RewriteCond %{HTTP_HOST} !^example\.com$ [NC] RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC] # 提取子域名部分(匹配三级域名格式,比如sub.example.com) RewriteCond %{HTTP_HOST} ^([a-z0-9-_]+)\.example\.com$ [NC] # 将请求转发到对应子目录,保留原URL路径 RewriteRule ^(.*)$ /%1/$1 [L]
规则拆解说明
我给你解释下每条规则的作用,方便你根据自己的情况调整:
RewriteEngine On:开启重写引擎,这是所有重写规则的基础,必须放在最开头- 前两条
RewriteCond:用来排除主域名和www子域名,避免这些域名被错误映射。[NC]表示匹配时不区分大小写 - 第三条
RewriteCond:用正则表达式捕获子域名部分,比如sub.example.com里的sub会被存到变量%1里。正则里的[a-z0-9-_]+覆盖了大部分合法的子域名字符,如果你的子域名有特殊字符,可以自行添加到正则里 RewriteRule:把用户请求的路径(比如sub.example.com/article/1)内部转发到主域名的对应子目录(example.com/sub/article/1),[L]表示这是最后一条规则,处理完就停止后续匹配
实际效果验证
配置好之后,就能实现你要的效果:
- 访问
http://sub.example.com/→ 实际加载http://example.com/sub/的内容 - 访问
http://sub1.example.com/about→ 实际加载http://example.com/sub1/about的内容 - 访问
http://sub2.example.com/images/logo.png→ 实际加载http://example.com/sub2/images/logo.png的内容
额外注意点
- 确保每个子域名对应的子目录已经存在于网站根目录,否则会返回404错误
- 如果你的子域名是多层级的(比如
sub.sub2.example.com),需要修改正则表达式来适配,不过大部分场景下三级域名的规则就足够用了 - 这个规则是内部转发,不会改变地址栏显示的子域名,用户看到的还是
sub.example.com,但实际加载的是子目录内容
内容的提问来源于stack exchange,提问作者Philipp
相关产品推荐
相关产品推荐

