上一篇
htaccess绑定域名到子目录的方法
- 行业动态
- 2025-05-02
- 3103
在.htaccess中配置RewriteEngine,通过RewriteCond检查域名,RewriteRule将请求重定向至子目录,实现域名
前提条件
- 服务器环境:必须使用支持
.htaccess
的Apache服务器,且开启mod_rewrite
模块。 - 域名解析:需将目标域名(如
test.example.com
)的A记录指向服务器IP。 - 文件权限:确保
.htaccess
文件有读取权限,且位于目标子目录的上级目录(如网站根目录)。
实现步骤
启用mod_rewrite
模块
在Apache配置文件中确保加载mod_rewrite
:
LoadModule rewrite_module modules/mod_rewrite.so
创建目标子目录
假设主域名为example.com
,需将test.example.com
绑定到/var/www/html/test
目录:
mkdir -p /var/www/html/test
编写.htaccess
规则
在网站根目录(如/var/www/html/
)的.htaccess
文件中添加以下规则:
规则类型 | 作用说明 | |
---|---|---|
域名匹配 | apache<IfModule mod_rewrite.c>RewriteEngine On# 将test.example.com指向/test/目录RewriteCond %{HTTP_HOST} ^test.example.com$ [NC]RewriteRule ^(.)$ test/$1 [L]</IfModule> | 当请求域名为test.example.com 时,将所有URL路径重定向到/test/ 子目录。 | |
多域名支持 | apache# 将shop.example.com指向/shop/目录RewriteCond %{HTTP_HOST} ^shop.example.com$ [NC]RewriteRule ^(.)$ shop/$1 [L] | 可追加多个RewriteCond 和RewriteRule 实现多域名绑定。 | |
默认域名处理 | apache# 主域名example.com保持原路径RewriteCond %{HTTP_HOST} !^(test.|shop.)example.com$ [NC]RewriteRule ^(.)$ $1 [L] | 确保主域名不受影响,仅绑定特定子域名。 |
完整示例配置
<IfModule mod_rewrite.c> RewriteEngine On # 绑定test.example.com到/test/目录 RewriteCond %{HTTP_HOST} ^test.example.com$ [NC] RewriteRule ^(.)$ test/$1 [L] # 绑定shop.example.com到/shop/目录 RewriteCond %{HTTP_HOST} ^shop.example.com$ [NC] RewriteRule ^(.)$ shop/$1 [L] # 其他域名保持默认行为 RewriteCond %{HTTP_HOST} !^(test.|shop.)example.com$ [NC] RewriteRule ^(.)$ $1 [L] </IfModule>
关键参数解释
指令 | 作用 | 示例 |
---|---|---|
RewriteEngine On | 启用重写引擎 | 必选 |
RewriteCond | 设置重写条件(如匹配域名) | %{HTTP_HOST} 表示当前请求的域名 |
RewriteRule | 定义重写规则 | ^(.)$ 匹配所有路径,test/$1 表示追加子目录前缀 |
[NC] | 不区分大小写 | 避免因域名大小写问题导致匹配失败 |
[L] | 结束当前规则链 | 防止后续规则继续执行 |
常见问题与解决方案
循环重定向问题
原因:目标子目录内也有.htaccess
文件,导致无限重定向。
解决:在子目录的.htaccess
中添加条件排除自身域名:
# 在/test/.htaccess中添加 RewriteCond %{HTTP_HOST} !=test.example.com RewriteRule ^(.)$ /test/$1 [L]
子目录资源访问异常
原因:直接访问子目录文件(如test.example.com/index.php
)时路径错误。
解决:允许直接访问子目录文件,跳过重写:
# 在主.htaccess中添加 RewriteCond %{REQUEST_FILENAME} -f RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ [L]
测试验证
- 工具测试:使用htaccess编辑器模拟规则效果。
- 浏览器访问:输入
http://test.example.com/abc
,应等同于http://example.com/test/abc
。 - 日志排查:检查服务器错误日志(如
/var/log/apache2/error.log
)确认是否有重定向错误。
FAQs
问:如何绑定多个二级域名到不同子目录?
答:在.htaccess
中追加新的RewriteCond
和RewriteRule
组合。
# 绑定api.example.com到/api/目录 RewriteCond %{HTTP_HOST} ^api.example.com$ [NC] RewriteRule ^(.)$ api/$1 [L]
问:子目录下的PHP文件无法执行怎么办?
答:确保子目录有独立.htaccess
文件,或调整主规则允许直接访问文件:
# 允许直接访问存在的文件 RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ [L