当前位置:首页 > 行业动态 > 正文

htaccess绑定域名到子目录的方法

在.htaccess中配置RewriteEngine,通过RewriteCond检查域名,RewriteRule将请求重定向至子目录,实现域名

前提条件

  1. 服务器环境:必须使用支持.htaccess的Apache服务器,且开启mod_rewrite模块。
  2. 域名解析:需将目标域名(如test.example.com)的A记录指向服务器IP。
  3. 文件权限:确保.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] | 可追加多个RewriteCondRewriteRule实现多域名绑定。
默认域名处理 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]

测试验证

  1. 工具测试:使用htaccess编辑器模拟规则效果。
  2. 浏览器访问:输入http://test.example.com/abc,应等同于http://example.com/test/abc
  3. 日志排查:检查服务器错误日志(如/var/log/apache2/error.log)确认是否有重定向错误。

FAQs

问:如何绑定多个二级域名到不同子目录?

答:在.htaccess中追加新的RewriteCondRewriteRule组合。

# 绑定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
0