limitrequestfields应在virtualhost中设为40–50以限制请求头数量防dos,必须配合limitrequestfieldsize和limitrequestline使用,值须为1–100整数,不可在directory/location中配置。
在虚拟主机(virtualhost)中配置 limitrequestfields,是为了限制 http 请求头字段的数量,防止攻击者通过构造超多请求头(如数百个 cookie、x-forwarded-for 等)耗尽服务器内存或解析资源,从而触发应用层 dos(尤其是针对 apache 的慢速或畸形头部攻击)。
这个指令仅适用于 Apache 2.3.9 及以上版本,且必须放在 <virtualhost></virtualhost> 块内或 .htaccess(需允许 LimitRequestFields 覆盖),不能写在全局 httpd.conf 的 ServerConfig 级别以外的非容器上下文中。
✅ 正确配置方式(在 VirtualHost 中)
<virtualhost>
ServerName example.com
DocumentRoot /var/www/html
# 限制每个请求最多包含 50 个 HTTP 头部字段
LimitRequestFields 50
# (可选)进一步收紧单个头部长度,防超长字段
LimitRequestFieldSize 8190
LimitRequestLine 8190
</virtualhost>
⚠️ 注意:
LimitRequestFields的值必须是 1–100 之间的整数。设为0表示不限制(不推荐),设为1会严重破坏正常请求(如带多个 Cookie、Accept 头的浏览器请求通常已有 10+ 字段)。
? 为什么有效?
- 每个 HTTP 头部字段在 Apache 内部会分配内存并解析,过多字段会导致:
- 内存占用激增(尤其高并发时)
- 解析时间延长,阻塞 worker 进程
- 触发
mod_reqtimeout或直接 400 错误,但不如提前拦截干净
- 攻击者常配合
Slowloris或CC-like工具发送带 200+X-头的请求,此配置可立即拒绝。
? 常见错误与规避
- ❌ 在
<directory></directory>或<location></location>中使用 —— 不支持,Apache 会报错Invalid command 'LimitRequestFields' - ❌ 设为
LimitRequestFields 1000—— 超出允许范围,启动失败 - ❌ 忘记同步调整
LimitRequestFieldSize—— 单个超长头仍可绕过(例如一个 1MB 的Cookie头) - ❌ 未重启 Apache —— 配置不会生效
sudo systemctl reload apache2 # Debian/Ubuntu # 或 sudo apachectl graceful # 通用
✅ 推荐组合加固(同 VirtualHost 内)
# 防头部泛滥 LimitRequestFields 40 LimitRequestFieldSize 4096 LimitRequestLine 4096 # 防请求体过大(如恶意上传或 POST flood) LimitRequestBody 2097152 # 2MB # 防连接耗尽(配合 mod_reqtimeout) Timeout 10 KeepAliveTimeout 3
这些值可根据业务微调:
- 静态站点 →
LimitRequestFields 30足够 - 含 OAuth、多 CDN 头、GraphQL 的 API 站点 → 建议
40–50 - 内网可信环境可略放宽,但不建议超过
60
不复杂但容易忽略。










