如何配置.htaccess实现多个子目录各自作为独立站点根目录运行
实现方案
以下是两种不同权限场景下的可行实现思路,均适配你描述的多子目录独立根目录需求:
方案1:有站点全局配置权限(隔离性最优)
优先在站点根目录(即mydomain.com对应的服务器根目录)放置.htaccess做统一重写,再配合子目录独立配置实现完全隔离:
根目录.htaccess配置
RewriteEngine On # 适配site1的根路径资源请求 RewriteCond %{REQUEST_URI} !^/site1/ RewriteCond %{HTTP_REFERER} ^https?://[^/]+/site1(/.*)?$ [NC] RewriteRule ^(.*)$ /site1/$1 [L] # 适配site2的根路径资源请求 RewriteCond %{REQUEST_URI} !^/site2/ RewriteCond %{HTTP_REFERER} ^https?://[^/]+/site2(/.*)?$ [NC] RewriteRule ^(.*)$ /site2/$1 [L] # 子目录根路径访问自动补全斜杠 RewriteRule ^site1$ /site1/ [L,R=301] RewriteRule ^site2$ /site2/ [L,R=301]
子目录单独配置(site1、site2目录下分别放置)
RewriteEngine On # 禁止跨父级目录访问 RewriteCond %{REQUEST_URI} \.\./ [NC] RewriteRule ^.*$ - [F,L] # 修正PHP运行时的根目录判定,site2配置替换为对应路径即可 php_value auto_prepend_file /你的服务器实际路径/mydomain.com/site1/fix_root.php
新增根目录修正脚本
在每个子目录下新建fix_root.php,覆盖应用读取的根目录参数:
<?php $_SERVER['DOCUMENT_ROOT'] = __DIR__; $_SERVER['SCRIPT_NAME'] = str_replace(dirname($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']); ?>
方案2:仅拥有子目录写入权限(无全局配置权限时使用)
如果只能操作site1、site2目录内的文件,直接在子目录下放置如下.htaccess即可:
RewriteEngine On RewriteBase /site1/ # site2配置只需要把上面的RewriteBase改为/site2/即可 # 映射所有根路径资源请求到当前子目录 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ $1 [L] RewriteRule ^/(.*)$ /site1/$1 [L]
如果使用CodeIgniter框架,额外修改应用配置文件中的$config['base_url']为https://mydomain.com/site1/,$config['index_page']留空即可适配。
内容的提问来源于stack exchange,提问作者eyal_katz
相关产品推荐
相关产品推荐

