如何用.htaccess将子域名指向同主机子目录(不跳转)
.htaccess子域名指向对应子目录的正确规则配置
首先确认.htaccess文件的放置位置:必须放在网站根目录(即主域名example.com对应的服务器根目录,比如/public_html/),如果放在子目录里规则不会生效。
原规则的问题
你提供的规则存在两个关键问题:
^(?:live\.example\.com)?$这个正则表达式里的?表示匹配空值或live.example.com,会导致主域名也被错误匹配。- 只处理了单个子域名,没有覆盖另外两个需求的子域名。
解决方案
根据需求,提供两种配置方式:
方式一:通用匹配(子域名与目录名完全一致时使用)
如果三个子域名(比如live、blog、store)和对应的子目录名完全相同,用这个规则可以一次性处理所有匹配项:
RewriteEngine On # 匹配子域名前缀,对应到同名子目录 RewriteCond %{HTTP_HOST} ^([a-z0-9-]+)\.example\.com$ [NC] RewriteCond %{REQUEST_URI} !^/%1/ RewriteRule ^(.*)$ /%1/$1 [L,NC]
- 第一个条件捕获子域名的前缀(比如live),存储到
%1变量中。 - 第二个条件确保请求未指向对应子目录,避免循环重写。
- 最后将请求重写到对应子目录,URL保持子域名不变。
方式二:指定子域名(更灵活,可自定义目录名)
如果子域名和目录名不一致,或者只想指定特定三个子域名,用独立规则组更清晰:
RewriteEngine On # live.example.com 指向 /live/ RewriteCond %{HTTP_HOST} ^live\.example\.com$ [NC] RewriteCond %{REQUEST_URI} !^/live/ RewriteRule ^(.*)$ /live/$1 [L,NC] # blog.example.com 指向 /blog/ RewriteCond %{HTTP_HOST} ^blog\.example\.com$ [NC] RewriteCond %{REQUEST_URI} !^/blog/ RewriteRule ^(.*)$ /blog/$1 [L,NC] # store.example.com 指向 /store/ RewriteCond %{HTTP_HOST} ^store\.example\.com$ [NC] RewriteCond %{REQUEST_URI} !^/store/ RewriteRule ^(.*)$ /store/$1 [L,NC]
额外注意事项
- 确保服务器已启用
mod_rewrite模块,并且虚拟主机配置中设置了AllowOverride All(否则.htaccess规则不会被执行)。 - 对应的子目录必须存在,且设置了正确的读写权限。
- 测试前清空浏览器缓存,避免旧缓存干扰结果。
内容的提问来源于stack exchange,提问作者James Mattison
相关产品推荐
相关产品推荐

