如何通过两个.htaccess解决根目录与子目录的index.php跳转异常
子目录非首页跳转根目录404的解决办法
问题
根目录和子目录分别安装了不同脚本,原本预期两个脚本各自指向对应目录的index.php,但访问子目录的非首页页面时,会跳转到根目录的404页面,仅子目录首页可正常访问。
当前配置
根目录.htaccess代码:
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.html [L] </IfModule>
子目录.htaccess代码:
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews </IfModule> RewriteEngine on RewriteCond %{HTTP_HOST} ^www\.(([a-z0-9_]+\.)?website\.it)$ [NC] RewriteRule .? http://%1%{REQUEST_URI} [R=301,L] # Handle Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>
问题根源
根目录的.htaccess规则会拦截所有不存在的文件/目录请求,包括子目录下的非首页请求。比如访问/subdir/xxx时,该路径既不是文件也不是目录,根目录的规则会直接将请求重写到根目录的index.html,导致子目录的.htaccess没有机会处理请求。
修复方案
修改根目录的.htaccess,添加规则排除子目录的请求,让子目录的配置自行处理:
<IfModule mod_rewrite.c> RewriteEngine On # 将 "subdir" 替换为你的实际子目录名称 RewriteRule ^subdir/ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.html [L] </IfModule>
补充说明
RewriteRule ^subdir/ - [L]:匹配所有以子目录开头的请求,-表示不执行重写操作,[L]表示终止后续规则处理,确保子目录的请求直接交由子目录的.htaccess处理。- 若存在多个需要排除的子目录,可写成
RewriteRule ^(subdir1|subdir2)/ - [L],用竖线分隔多个目录名即可。
内容的提问来源于stack exchange,提问作者Alessandro
相关产品推荐
相关产品推荐

