如何通过.htaccess禁止访问根目录文件并允许访问子目录内容
.htaccess访问控制配置方案
实现目标
按照需求实现的访问控制规则对应目录结构如下:
- 根目录(禁止访问) - index.php(不可访问) - demo.php(不可访问) - .htaccess(存放本次配置) - Subfolder-1(允许访问其下所有文件和嵌套文件夹) - index.php - example.php - Subfolder-1-Subfolder - Subfolder-2(允许访问其下所有文件和嵌套文件夹) - index.php - example.php - Subfolder-2-Subfolder
核心控制逻辑:
- 完全禁止访问根目录本身、根目录下直接存放的所有文件,同时关闭根目录的目录列表功能
- 根目录下所有层级的子文件夹、子文件夹内部的任意文件和嵌套目录都可正常访问,不受限制
具体配置代码
将以下代码写入根目录下的.htaccess文件即可,子目录无需额外添加配置:
# 关闭目录列表功能,禁止服务器直接返回目录下的文件清单 Options -Indexes # 开启URL重写引擎 RewriteEngine On # 拦截对站点根路径的直接访问,返回403禁止状态 RewriteRule ^$ - [F,L] # 仅拦截根目录下直接存放的文件请求,放行对子目录的直接访问(兼容子目录访问不带末尾斜杠的场景) RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^[^/]+$ - [F,L]
规则生效说明
- 所有返回403的拦截场景:
- 直接访问站点域名根路径(如
https://example.com/) - 直接请求根目录下存放的任意文件(如
https://example.com/index.php、https://example.com/demo.php) - 根目录无默认首页时,不会展示目录文件列表
- 直接访问站点域名根路径(如
- 所有不受拦截、可正常访问的场景:
- 访问根目录下任意一级子目录(兼容带/不带末尾斜杠的访问形式,如
https://example.com/Subfolder-1、https://example.com/Subfolder-1/) - 访问子目录下任意层级的文件、嵌套子目录内容(如
https://example.com/Subfolder-2/Subfolder-2-Subfolder/test.php)
- 访问根目录下任意一级子目录(兼容带/不带末尾斜杠的访问形式,如
说明:
- 规则依赖Apache的mod_rewrite模块,绝大多数虚拟主机环境默认开启该模块,若规则不生效可先确认模块是否启用
- 配置中的
Options -Indexes默认会同时关闭所有子目录的目录列表,如果需要某个子目录开启文件列表展示,在对应子目录下新建.htaccess写入Options +Indexes即可覆盖配置
内容的提问来源于stack exchange,提问作者Amrit Jha
相关产品推荐
相关产品推荐

