limitrequestline 是 apache 对 http 请求行长度的硬性截断阈值,非可选防护;默认 8190 字节易被滥用于触发崩溃,须在主配置或虚拟主机中设为 2048–4096 并重启生效。

LimitRequestLine 是什么,为什么必须设
它不是可选的防护开关,而是 Apache 对单个 HTTP 请求行(即 GET /very-long-path... HTTP/1.1 这整行)长度的硬性截断阈值。默认值通常是 8190 字节,远高于常见场景所需,攻击者可构造超长 URL 触发缓冲区耗尽、解析失败甚至进程崩溃。不设等于默认放行所有畸形长请求,尤其在反代后端或暴露 WebDAV/CGI 的场景下风险陡增。
怎么设置 LimitRequestLine 才真正生效
该指令只在主配置或虚拟主机上下文中有效,不能写在 .htaccess 里。常见错误是把它丢进目录级配置,结果完全不生效。
- 编辑主配置文件(如
/etc/apache2/apache2.conf或/etc/httpd/conf/httpd.conf),或对应<virtualhost></virtualhost>块内 - 添加一行:
LimitRequestLine 4096(推荐值:2048–4096,兼顾兼容性和安全性) - 重启 Apache:
sudo systemctl restart apache2(Debian/Ubuntu)或sudo systemctl restart httpd(RHEL/CentOS) - 验证是否加载成功:
apache2ctl -t或httpd -t检查语法;再用curl -v "http://localhost/$(printf 'a%.0s' {1..5000})"测试是否返回 414(URI Too Long)
和 LimitRequestFieldSize、LimitRequestBody 的区别与配合
这三个指令管不同位置,不能互相替代:
-
LimitRequestLine:只控请求行总长(方法 + 路径 + 协议版本) -
LimitRequestFieldSize:控单个 HTTP 请求头字段(如User-Agent)最大长度,默认 8190 -
LimitRequestBody:控整个请求体(POST body)大小,单位字节
例如,一个带超长 Referer 头的 POST 请求,LimitRequestLine 不会拦截它——得靠 LimitRequestFieldSize。三者建议统一收紧,比如都设为 4096,避免防御缺口。
容易被忽略的兼容性问题
某些老旧客户端或内部工具(如旧版 Java HttpURLConnection、特定 IoT 设备 SDK)可能生成略长于 4096 的请求行,不是攻击,但会被直接拒掉。上线前务必测试真实业务流量:
- 用
tcpdump或 Apache 日志%r字段抽样检查最长请求行实际长度 - 注意重定向链路:302 返回的
Location若含长参数,可能让客户端二次发起更长 GET - 如果用了 mod_proxy,
LimitRequestLine仅作用于接入层请求,后端服务仍需各自设防
设太小会误杀,设太大等于没设。真实业务中,超过 2048 字节的合法 GET 请求极少,优先从 2048 开始压测,再视日志调整。









