LimitRequestBody 用于限制请求体大小,需在 server、vhost、directory 或 .htaccess(AllowOverride Limit)中配置,单位字节,最内层生效;须与 PHP upload_max_filesize 协同设置,建议 Apache 限制略大以容纳请求头等开销。

Apache 默认不限制请求体大小,但生产环境必须设限,否则可能被恶意上传拖垮服务器。
LimitRequestBody 指令在哪配、怎么生效
它只能出现在 server config、virtual host、directory 或 .htaccess(需 AllowOverride Limit)中,不支持在 Location 块里用。指令值单位是字节,比如 LimitRequestBody 1048576 表示 1MB。
- 放在
Vhost里影响整个站点;放在<directory></directory>里只限制该目录下的 POST/PUT 请求 - 如果多个作用域都设置了,以最内层(如 .htaccess)为准
- 设为
0表示禁用限制(不推荐),负数无效,会直接导致 Apache 启动失败
和 PHP upload_max_filesize 的关系别搞混
Apache 的 LimitRequestBody 是网络层拦截,在请求体进入 PHP 之前就拒绝;而 upload_max_filesize 是 PHP 解析阶段才检查。两者必须协同设置,否则会出现“Apache 放行了,PHP 却报错”的情况。
- 例如:Apache 设了
LimitRequestBody 2097152(2MB),但 PHP 的upload_max_filesize = 4M,用户上传 3MB 文件时,Apache 已经返回 413 Request Entity Too Large,PHP 根本不会执行 - 反过来,如果 Apache 限制太松(比如 10M),而 PHP 设为 2M,那么 3MB 文件能进到 PHP,再由
$_FILES返回error=1 - 建议 Apache 限制略大于 PHP 限制(比如 +100KB),留出请求头和其他表单字段的空间
遇到 413 错误但没看到日志?检查这些点
不是所有 413 都来自 LimitRequestBody,常见干扰项包括:
- 反向代理(如 Nginx 前置)自身有
client_max_body_size,它先于 Apache 拦截,Apache 日志里完全看不到该请求 - ModSecurity 规则也可能返回 413,查
modsec_audit.log而非error_log - 如果用了
mod_php,某些旧版本在 LimitRequestBody 生效时不会记录详细原因,升级到 2.4.53+ 更可靠 - 确认配置已重载:
sudo apachectl configtest && sudo systemctl reload apache2,别忘了.htaccess需要AllowOverride Limit才有效
真正麻烦的是 multipart/form-data 中混合大文件和大量文本字段的场景——LimitRequestBody 统计的是整个请求体字节数,包括 boundary、字段名、换行符等,实际可用空间比你预想的少几 KB。测的时候最好用 curl 构造真实请求体验证,而不是只看文件大小。

















