通过.htaccess实现子域名映射主站目录 保持浏览器原URL不变
问题根因
你现有配置使用了R=301强制外部跳转,同时RewriteRule指向带协议的绝对URL,服务器会直接返回301响应通知浏览器跳转至新地址,这就是地址栏变更的原因。要实现地址栏保持不变,需要改用服务器内部重写,也就是服务端直接将子域名请求映射到/loja目录,不向浏览器返回跳转指令。
修正后的.htaccess配置
Options +FollowSymLinks RewriteEngine on Options +MultiViews # 匹配loja子域名(含www前缀的情况) RewriteCond %{HTTP_HOST} ^loja\.meusite\.com\.br$ [OR] RewriteCond %{HTTP_HOST} ^www\.loja\.meusite\.com\.br$ # 内部重写到主站/loja目录,无跳转响应 RewriteRule ^(.*)$ /loja/$1 [L]
关键改动说明
- 删除了原有
REQUEST_FILENAME的两个判断条件:原条件会在请求命中主站根目录下的现有文件/目录时终止规则,导致子域名请求无法正确映射到/loja目录,移除后可保证所有loja子域名的请求都指向/loja下的对应资源 - 去掉了
R=301跳转标记:这是地址栏变更的核心触发因素,移除后不会向浏览器返回跳转指令 - 将绝对URL目标替换为内部路径:把原来的
http://www.meusite.com/loja$1改为相对服务器根目录的/loja/$1,完全在服务端完成路径映射,浏览器无感知 - 补充了域名正则的点号转义:避免正则中的
.匹配任意字符,防止非法域名被误匹配触发规则
生效前置要求
- loja.meusite.com.br的DNS已正确解析到主站所在服务器
- 对应Apache虚拟主机的
AllowOverride配置为All,允许.htaccess规则生效
补充说明:如果映射后出现静态资源(CSS、JS、图片)加载异常,可在/loja目录下的页面头部添加
<base href="/loja/">,或直接使用绝对路径引用资源,避免路径解析错误。
内容的提问来源于stack exchange,提问作者denis
相关产品推荐
相关产品推荐

