FilesMatch配合正则表达式是最简洁可靠的禁止方案,需置于VirtualHost或Directory块中,用Require all denied封禁指定后缀(如.sql|bak|env|log|sh),结尾加$防误杀,大小写敏感时需统一小写或启用mod_speling。

直接用 <FilesMatch> 配合正则表达式,是最简洁、最可靠的一键禁止方案。它不依赖路径重写,不绕过文件系统校验,Apache 2.4+ 原生支持,写一次就能覆盖所有匹配后缀。
核心配置:用 FilesMatch 一次性封禁多个后缀
把以下代码放入虚拟主机配置(<VirtualHost>)或站点根目录的 <Directory> 块中(不能放 Location 或 .htaccess 里):
<FilesMatch "\.(sql|bak|env|log|sh|pem|git)$">
Require all denied
</FilesMatch>-
结尾必须加
$:防止误杀如mysql.php这类含子串但非目标后缀的文件 -
大小写敏感? 默认区分,如需兼容
.SQL或.Bak,加[NC]标志(但 Apache 2.4 的FilesMatch不支持标志位),稳妥做法是统一小写写法 + 启用mod_speling或改用mod_rewrite方案 -
Apache 2.2 用户注意:把
Require all denied换成Order deny,allow && Deny from all,混用会报 500 错误
补充加固:配合 .htaccess 使用的前提
如果想把规则写在网站根目录的 .htaccess 文件里(比如没权限改主配置),必须确保对应目录的主配置已启用覆盖权限:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<Directory "/var/www/html">
AllowOverride FileInfo
</Directory>-
FileInfo就够了——它允许FilesMatch和mod_rewrite相关指令,比开All更安全 - 改完主配置后执行:
apachectl configtest && systemctl reload apache2 - Debian/Ubuntu 系统还需确认
mod_rewrite已启用:a2enmod rewrite
进阶兜底:当 FilesMatch 失效时的替代方案
某些场景下(如文件不在 DocumentRoot 下、或 URL 经过重写映射),FilesMatch 不生效。此时用 mod_rewrite 在请求阶段拦截:
RewriteEngine On
RewriteCond %{REQUEST_URI} \.(sql|bak|env|log|sh)$ [NC]
RewriteRule ^ - [F]-
[F]返回 403 Forbidden,语义准确;用[R=404]会伪装成不存在,但实际资源仍可被直连访问,不推荐 -
[NC]关键:避免大小写绕过(如.SQL) - 这条规则要放在其他重写规则之前,否则可能被跳过
验证是否生效的快速方法
部署后,直接浏览器访问一个测试文件,例如:https://yoursite.com/config.sql
- 返回 403 Forbidden → 成功拦截
- 返回 404 Not Found → 规则未命中(检查路径、大小写、作用域)
- 返回文件内容或下载弹窗 → 完全未生效(检查
AllowOverride、模块启用、配置重载)

















