如何让.htaccess规则同时适配根目录与子目录的index.php?
修改.htaccess规则实现子目录适配需求
要实现请求匹配对应子目录index.php、无对应子目录时走根目录index.php的需求,你可以在原有规则基础上新增优先匹配子目录的规则,具体修改后的代码如下:
# 强制跳转至HTTPS RewriteCond %{HTTPS} !=on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # 优先适配存在的子目录(子目录下需包含index.php) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{DOCUMENT_ROOT}/$1/index.php -f RewriteRule ^([^/]+)/(.*)$ $1/index.php [QSA,L] # 无对应子目录时,转发至根目录index.php RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [QSA,L]
规则说明:
- HTTPS跳转规则:和原代码一致,确保所有请求都使用HTTPS协议。
- 子目录匹配规则:
- 先判断请求的不是真实存在的文件,避免干扰静态资源访问。
- 检查请求路径的第一个分段(比如请求
/blog/post时,$1就是blog)对应的子目录下是否存在index.php。 - 如果满足条件,就将请求转发到该子目录的
index.php,同时保留原查询参数(QSA标记),并终止后续规则执行(L标记)。
- 根目录 fallback 规则:当请求路径没有匹配到任何存在的子目录时,就会执行这条规则,和原逻辑一致,转发到根目录的
index.php。
注意事项:
- 确保你创建的子目录下确实存在
index.php文件,否则这条子目录规则不会生效。 - 如果你需要支持多级子目录(比如
/blog/article/detail),可以将子目录匹配规则的正则修改为^([^/]+/[^/]+)/(.*)$,同时调整对应的条件判断为%{DOCUMENT_ROOT}/$1/index.php -f,不过大部分场景下一级子目录的规则就足够使用。 - 测试前建议清空浏览器缓存,避免之前的301跳转缓存影响测试结果。
内容的提问来源于stack exchange,提问作者Atul
相关产品推荐
相关产品推荐

