Apache的<Directory>不能直接限制文件类型,需通过FilesMatch按后缀、SetEnvIf按MIME类型或mod_bw按大小+后缀组合实现精准拦截,且须注意配置作用域与继承优先级。

Apache 的 <Directory> 配置中不能直接“限制文件类型”,但可以通过组合 Require、FilesMatch、环境变量或 MIME 类型判断,实现对特定后缀或内容类型的精准拦截。关键在于:不是靠 Directory 本身过滤,而是把访问控制逻辑嵌套在它内部或配合其他上下文生效。
用 FilesMatch 按后缀禁止访问
这是最常用、最直观的方式,适合封禁 .bak、.log、.conf、.sql 等敏感后缀:
- 放在
<Directory>块内或独立配置段均可,推荐写在对应目录块里 - 匹配语法支持正则,可一次屏蔽多个扩展名
- 搭配
Require all denied即可彻底拒绝
示例(禁止访问所有 .inc 和 .env 文件):
<Directory "/var/www/html">Options None
AllowOverride None
<FilesMatch "\.(inc|env|bak|swp|gitignore)$">
Require all denied
</FilesMatch>
</Directory>
按 MIME 类型拦截更可靠
后缀可伪造,而 Apache 响应时设置的 Content-Type 更真实。适用于 ZIP、PDF、MP4 等易被下载的大文件或敏感文档:
- 需启用
mod_setenvif模块(默认通常已加载) - 用
SetEnvIf Content-Type标记风险类型,再用Require notenv拒绝 - 要求文件由 Apache 直接提供(非 PHP 输出),且
mime.types已正确定义类型
示例(阻止 application/octet-stream 和 text/plain 类型响应):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
SetEnvIf Content-Type "^application/octet-stream$" block-file
SetEnvIf Content-Type "^text/plain$" block-file
<RequireAll>
Require all granted
Require not env=block-file
</RequireAll>
</Directory>
结合大小与后缀做双重校验
单靠后缀不安全,加文件大小判断更严谨。需借助第三方模块如 mod_bw:
- 安装并启用
mod_bw.c(需编译或包管理器安装) - 用
LargeFileLimit对指定后缀+字节数设极低带宽(如 1KB/s),等效阻断下载 - 50MB = 52428800 字节,单位必须是字节
示例(.zip 超过 10MB 就限速到无法下载):
<IfModule mod_bw.c>BandwidthModule On
LargeFileLimit .zip 10485760 1024
LargeFileLimit .pdf 5242880 1024
</IfModule>
注意权限继承与作用域优先级
<Directory> 块里的规则会继承上级配置,但可能被 <Files>、<Location> 或 .htaccess 覆盖:
- 确保
AllowOverride设置合理(如设为None可禁用 .htaccess 干扰) - 若同时存在多个匹配规则,以最内层、最具体的配置为准
- 测试时用
curl -I查看 HTTP 状态码(403 表示成功拦截)
不复杂但容易忽略。

















