如何通过.htaccess或虚拟主机配置实现多域名动态映射到主域子目录
完全可以实现,推荐优先使用虚拟主机配置(性能更高、规则全局生效),也可以通过各门店域名根目录的.htaccess文件配置,具体操作如下:
方案1:统一虚拟主机配置(推荐)
将所有门店域名的虚拟主机DocumentRoot设置为和domain.com完全相同的站点根目录,直接复用原有站点的所有代码和重写规则,无需修改业务逻辑。
在domain.com的虚拟主机配置文件中,原有重写规则的最上方添加以下门店域名映射规则即可:
RewriteEngine On # 适配带www前缀的门店域名,NC表示不区分大小写 RewriteCond %{HTTP_HOST} ^(www\.)?store1\.com$ [NC] RewriteRule ^(.*)$ /store1/$1 [QSA,L] RewriteCond %{HTTP_HOST} ^(www\.)?store2\.com$ [NC] RewriteRule ^(.*)$ /store2/$1 [QSA,L] RewriteCond %{HTTP_HOST} ^(www\.)?store3\.com$ [NC] RewriteRule ^(.*)$ /store3/$1 [QSA,L]
如果门店数量较多,可通过RewriteMap实现动态映射,无需每次新增门店都修改重写规则:
- 新建门店映射文件
/etc/apache2/store_map.txt,内容格式如下:
store1.com store1 store2.com store2 store3.com store3 www.store1.com store1 www.store2.com store2 www.store3.com store3
- 在虚拟主机配置中添加如下动态规则:
RewriteMap storemap txt:/etc/apache2/store_map.txt RewriteCond %{HTTP_HOST} ^([^.]+\.[^.]+)$ [NC] RewriteCond ${storemap:%1|NOTFOUND} !NOTFOUND RewriteRule ^(.*)$ /${storemap:%1}/$1 [QSA,L]
方案2:门店域名独立.htaccess配置
如果没有权限修改Apache虚拟主机配置,可在各门店域名对应的根目录下新建.htaccess文件实现,以store1.com为例:
RewriteEngine On # 内部重写所有请求到对应门店路径,PT标志确保重写后的路径可被原有站点规则正常处理 RewriteRule ^(.*)$ /store1/$1 [QSA,L,PT]
注意事项
- 所有规则不要加
R=3xx的重定向标志,默认就是内部重写,用户地址栏始终显示门店自有域名,不会发生跳转 - 建议在原有站点的重写规则最上方添加真实文件/目录跳过逻辑,避免静态资源(图片、CSS、JS等)被重写导致404:
RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L]
- 业务代码中不要写死
domain.com的域名,需动态获取当前请求的域名生成页面链接 - SEO优化建议:每个页面添加
canonical标签,指定对应内容的官方URL,避免重复内容被搜索引擎降权 - 所有域名需配置正确的SSL证书,避免HTTPS访问报错
内容的提问来源于stack exchange,提问作者Andres SK
相关产品推荐
相关产品推荐

