apache 的 块中只能通过 limitrequestbody 限制请求体总大小(含文件、表单等),单位为字节,需与 php 的 upload_max_filesize 和 post_max_size 配合使用,三者取最小值生效,并须禁用上传目录脚本执行。

在 Apache 的 <directory></directory> 配置块中,不能直接限制“上传文件大小”本身,因为 Apache 不解析上传内容、不识别文件字段。但它能通过 LimitRequestBody 指令,限制该目录下所有 HTTP 请求体的总字节数(含文件数据 + 表单字段 + multipart 边界),这是唯一原生、有效且必须设置的上传大小控制方式。
✅ 正确做法:在 <directory></directory> 块中设 LimitRequestBody
该指令作用于匹配路径下的所有 POST/PUT 请求,是第一道硬性拦截。超出即返回 413 Request Entity Too Large,请求根本不会到达 PHP 或后端。
<directory>
LimitRequestBody 20971520 # 即 20MB(单位:字节)
</directory>
- 必须使用字节为单位,不支持
20M或20MB写法 - 路径需与
DocumentRoot完全一致(如/var/www/example.com/uploads) - 修改后需重载服务:
sudo systemctl reload apache2(或httpd)
⚠️ 注意:这只是“Apache 层”限制,还需同步 PHP 层
仅设 LimitRequestBody 不够,PHP 仍会按自己的规则二次拦截。三者取最小值才生效:
| 层级 | 参数 | 说明 |
|---|---|---|
| Apache | LimitRequestBody 20971520 |
整个请求体上限(字节) |
| PHP | upload_max_filesize = 20M |
单个文件最大允许大小 |
| PHP | post_max_size = 22M |
整个 POST 数据上限(≥ upload_max_filesize,预留边界开销) |
? 示例配比(20MB 场景):
LimitRequestBody 20971520(20MB)upload_max_filesize = 20Mpost_max_size = 22M
Apache Superset Dashboard and SQL Exploration Skill下载Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
三者中任意一个超限,上传都会失败——常见表现是 $_FILES 为空、error_log 提示 POST Content-Length exceeds the limit。
? 别踩坑:这些写法无效或危险
❌
<directory ...> php_admin_value upload_max_filesize 20M </directory>
→ 仅在 mod_php 模式下有效,且必须配合LimitRequestBody;PHP-FPM 环境下完全忽略,还会报错。❌ 在
<directory></directory>中写AllowOverride All后靠.htaccess设php_value
→ 不安全、易被绕过,且同样不适用于 PHP-FPM;生产环境应禁用.htaccess(AllowOverride None)。❌ 把
LimitRequestBody写在<virtualhost></virtualhost>外层却期望只对某个子目录生效
→ 必须放在能精确匹配上传路径的<directory></directory>或<location></location>块内,否则可能不生效或影响过广。
? 顺便加固上传目录(强烈建议)
上传目录除了大小限制,还必须防脚本执行:
<directory>
LimitRequestBody 20971520
Options -ExecCGI -Includes -Indexes
AllowOverride None
Require all granted
# 禁止执行任何脚本文件
<filesmatch>
Require all denied
</filesmatch></directory>
这样既控了大小,又防了上传 Webshell。










