FilesMatch最可靠,需置于Directory或虚拟主机中;mod_rewrite适用于重写路径;AllowOverride需启用FileInfo;RedirectMatch不具访问控制能力。

Apache中用FilesMatch匹配后缀并拒绝访问
直接在虚拟主机或目录配置块里用 FilesMatch 是最常用、也最可靠的方案。它支持正则,能一次匹配多个后缀,比逐个写 Files 更简洁。
常见错误是把规则写在错误的作用域里——比如放在 Location 块中,而 FilesMatch 只对文件系统路径生效,不适用于 URL 路径。必须确保它出现在 Directory 或虚拟主机根配置中。
- 拒绝所有
.env、.log、.bak文件:<FilesMatch "\.(env|log|bak)$"> Require all denied </FilesMatch> - 注意结尾的
$:防止误杀myenv.php这类名字含子串的文件 - Apache 2.4+ 必须用
Require all denied;2.2 用Deny from all,混用会导致 500 错误
用mod_rewrite在URL层面拦截(适合动态路径)
当文件不在 DocumentRoot 下、或路径由重写规则生成时,FilesMatch 失效,这时得靠 mod_rewrite 在请求阶段拦截。它不依赖物理文件是否存在,只看 URL 后缀。
典型场景是 Laravel 的 public 目录外还有上传目录,或静态资源经 rewrite 映射到非标准位置。
- 在
.htaccess或虚拟主机中启用重写:RewriteEngine On RewriteCond %{REQUEST_URI} \.(env|log|sql|sh)$ [NC] RewriteRule ^ - [F] -
[F]返回 403;[R=404]可伪装成文件不存在,但语义上不如 403 准确 -
[NC]很关键:避免因大小写绕过(如.ENV) - 这条规则要放在其他重写规则之前,否则可能被跳过
配合AllowOverride确认 .htaccess 是否生效
很多人写了 .htaccess 却没效果,根本原因是主配置里 AllowOverride 被设为 None,导致 Apache 忽略所有分散式配置。
检查对应 Directory 块是否允许覆盖:
<Directory "/var/www/html">
AllowOverride All
# 或至少:AllowOverride FileInfo
</Directory>
-
FileInfo就够用,它包含FilesMatch和mod_rewrite指令;没必要开All - 改完主配置记得
apachectl configtest && systemctl reload apache2,否则变更不生效 - 如果用的是 Debian/Ubuntu,还要确认
mod_rewrite已启用:a2enmod rewrite
为什么不用RedirectMatch做权限控制
RedirectMatch 是重定向指令,不是访问控制。它把请求发给客户端再跳转,原始资源仍可被直接访问——只要知道真实路径,绕过重定向就能拿到文件。
比如:
RedirectMatch 404 \.(env|log)$看似隐藏了文件,但返回 404 不等于禁止访问;服务器日志里仍会记录该请求,且攻击者可通过 HEAD 请求试探响应头判断文件存在性。
- 真正管控权限必须用
Require(2.4)或Deny(2.2),让请求在服务端就被截断 -
RedirectMatch适合 SEO 或迁移场景,不适合安全防护 - 混淆“隐藏”和“禁止”是线上最常被忽略的安全盲点

















