最稳妥做法是将LimitRequestBody直接写入块内,限制整个站点POST/PUT请求体大小,需比PHP upload_max_filesize略高100KB以覆盖boundary等开销,设为0则禁用限制,配置后须重载服务并用curl模拟真实multipart请求验证。
直接在虚拟主机配置块里加 limitrequestbody 就行,这是最稳妥、最常用的做法。它能精准控制该站点所有 post/put 请求的请求体上限,apache 在解析请求时就拦截超限内容,不进 php、不占资源。
在哪配:只写在 块内部
这个指令不能放 .htaccess、不能放
- 编辑对应站点的配置文件,比如
/etc/apache2/sites-available/example.com.conf - 在
或块里,DocumentRoot下方或块外均可添加 - 例如:
LimitRequestBody 10485760表示限制为 10MB
设多大:比 PHP 限制略高 100KB 左右
Apache 的限制要覆盖整个请求体,包括文件数据 + 表单字段 + boundary 分隔符 + 换行符等。光看文件大小会低估实际字节数。
- 如果 PHP 设了
upload_max_filesize = 8M和post_max_size = 8M,Apache 建议设LimitRequestBody 8388608(8MB)+ 102400 ≈8493056 - 纯 API 接口(如接收大 JSON)可单独设更高值,但别超过业务真实需要
- 设为
0表示不限制,生产环境严禁使用
怎么验证:用 curl 构造真实请求体测试
别只测单个大文件,要模拟真实上传场景——含多个字段、中文名、空格、换行等,否则可能漏掉边界问题。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 生成一个略超限的测试文件:
dd if=/dev/zero of=test.bin bs=1M count=9 - 用 curl 提交 multipart 表单:
curl -F "file=@test.bin" -F "desc=测试上传" http://example.com/upload.php - 预期返回 HTTP 413,且 Apache error_log 中应有对应记录;若返回 PHP 错误(如
$_FILES['file']['error'] === 1),说明 Apache 没拦住,配置未生效
常见踩坑点
配置写了却没效果?大概率是这几个地方卡住了:
-
AllowOverride Limit不影响LimitRequestBody,它本来就不支持 .htaccess,别往那里写 - 反向代理(如 Nginx)前置时,
client_max_body_size会先拦截,Apache 根本收不到请求,得同步调 Nginx 配置 - 修改后没重载:
sudo apachectl configtest && sudo systemctl reload apache2缺一不可 - 多个
共存时,确保改的是当前域名匹配的那个块,不是默认主机










