无需修改URL,将子域名映射到子目录(.htaccess实现)
解决.htaccess子域名到子目录的内部映射(保持URL不变)
我懂你要的是服务器端悄悄完成映射、浏览器地址栏完全不动的效果——也就是内部重写,而不是会跳转URL的外部重定向。你之前的规则用了绝对URL(http://example.com/%1/$1),这会触发浏览器跳转,自然就暴露了子目录路径。
下面是调整后的正确配置,完美满足你的两个需求:
RewriteEngine On RewriteBase / # 可选:排除主域名和www子域名(避免它们被错误映射) RewriteCond %{HTTP_HOST} !^www\.example\.com$ RewriteCond %{HTTP_HOST} !^example\.com$ # 匹配子域名,内部映射到对应子目录 RewriteCond %{HTTP_HOST} ^([a-z0-9-]+)\.example\.com$ [NC] RewriteRule ^(.*)$ %1/$1 [L,NC,QSA]
规则说明:
- 前两个
RewriteCond是用来过滤主域名(example.com)和www.example.com的,如果你希望www也映射到public_html/www目录,可以直接删掉这两行。 %{HTTP_HOST} ^([a-z0-9-]+)\.example\.com$会精准捕获子域名部分(比如test.example.com里的test),把它存在%1这个变量里。RewriteRule ^(.*)$ %1/$1 [L,NC,QSA]是核心:它把用户请求的路径(比如test.example.com/post/123)内部映射到服务器上的test/post/123目录,浏览器地址栏全程显示test.example.com/post/123,完全不会暴露子目录结构。[L]:告诉服务器处理完这条规则就停止,不用看后面的[NC]:不区分大小写,比如Test.example.com也能正常映射到test子目录[QSA]:保留原请求的查询参数,比如test.example.com?page=2会正确映射到test/?page=2,参数不会丢失
额外注意事项:
- 确保你的服务器配置里允许.htaccess生效,也就是在对应站点的配置中设置了
AllowOverride All - 子目录必须已经存在于
public_html目录下(比如test.example.com对应public_html/test) - 如果你的子域名需要支持下划线等特殊字符,把正则里的
[a-z0-9-]+改成[a-z0-9-_]+就行
内容的提问来源于stack exchange,提问作者Chris John
相关产品推荐
相关产品推荐

