最稳妥做法是用FilesMatch指令配合Require all denied,置于<Directory>或<VirtualHost>块内,正则加$锚定防误杀,如\.(env|log|sql|bak|sh|yml|conf)$;.htaccess需AllowOverride FileInfo生效;mod_rewrite仅作兜底,RedirectMatch不具访问控制能力。

在 Apache 中限制特定文件类型(如 .env、.log、.sql、.bak 等)的访问,核心目标是防止敏感文件被直接下载或泄露。最稳妥、推荐的做法是使用 FilesMatch 指令配合 Require 规则,作用于真实文件系统路径,且兼容 Apache 2.4+ 主流环境。
用 FilesMatch 精准拦截敏感后缀
这是首选方案,适用于绝大多数静态文件场景,比如站点根目录下的配置文件、日志、备份等:
- 必须写在
<Directory>或<VirtualHost>配置块内,不能放在<Location>中(后者不识别物理路径,会失效) - 正则表达式建议加锚定符
$,避免误杀:例如\.(env|log|sql)$不会误拦myenv.php - Apache 2.4+ 写法简洁明确:
<FilesMatch "\.(env|log|sql|bak|sh|yml|conf)$">
Require all denied
</FilesMatch> - 若仍在用 Apache 2.2,请改用
Deny from all,混用会导致 500 错误
通过 .htaccess 实现目录级控制
适合无法修改主配置的共享主机环境,但需确保前提条件满足:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 对应
<Directory>块中设置了AllowOverride FileInfo(或All),仅FileInfo就足够支持FilesMatch和重写规则 - 主配置中不能是
AllowOverride None——这是“写了没反应”的最常见原因 - 将规则放入站点根目录或子目录的
.htaccess文件即可,例如:
<FilesMatch "\.(env|git|htaccess)$">
Require all denied
</FilesMatch>
用 mod_rewrite 在 URL 层兜底拦截
适用于文件不在 DocumentRoot 下、或路径由重写动态生成的场景(如 Laravel 的 storage/、自定义上传目录):
- 启用重写引擎:
RewriteEngine On - 匹配请求 URI 后缀(忽略大小写):
RewriteCond %{REQUEST_URI} \.(env|log|sql|sh)$ [NC] - 返回 403 禁止访问:
RewriteRule ^ - [F]([R=404]可伪装成不存在,但不符合安全语义) - 该规则需置于其他重写规则之前;确认
mod_rewrite已启用(Debian/Ubuntu 执行a2enmod rewrite)
验证与生效关键步骤
无论采用哪种方式,都必须完成以下操作才能真正起效:
- 修改配置后,先运行
apachectl configtest(或apache2ctl configtest)检查语法是否正确 - 无报错后执行
systemctl reload apache2(或httpd -k graceful)热重载配置 - 手动测试访问一个被禁文件(如
https://yoursite.com/.env),确认返回 403 而非内容或 404 - 注意:不要用
RedirectMatch替代访问控制——它只是重定向,原始资源仍可被直接请求

















