LimitRequestLine 是 Apache 限制请求行最大字节数的安全指令,防止缓冲区溢出导致崩溃或远程代码执行;默认 8190 字节不足,建议设为 4096(常规场景)或不超过 8192(必要长 URI),须与 LimitRequestFieldSize 2048 和 LimitRequestFields 100 配套设置于 httpd.conf 或 VirtualHost 中,并重载生效。

LimitRequestLine 是什么,为什么必须设值
LimitRequestLine 控制 Apache 接收的整个请求行(例如 GET /very/long/path?with=many¶ms=... HTTP/1.1)最大字节数。它不是可选优化项,而是缓冲区溢出的第一道防线——Apache 内部用固定大小栈/堆缓冲区暂存请求行,超长内容会直接覆写相邻内存,导致崩溃、500 错误甚至远程代码执行(尤其在旧版或搭配 Perl CGI 时)。默认 8190 字节在 JWT、前端路由、深度嵌套查询参数场景下极易被突破。
怎么安全地设置 LimitRequestLine 值
不能盲目调大,也不能禁用(设为 0 或极大值等于自毁)。应基于业务真实需求收紧:
- 绝大多数 REST API 和页面跳转,
LimitRequestLine 4096已足够:覆盖典型路径 + 查询参数,同时大幅压缩攻击面 - 若业务确需长 URI(如含 Base64 编码 token 的单页应用路由),上限建议不超
8192;超过此值应优先重构为 POST + body 传参 - 该指令必须放在主配置
httpd.conf或虚拟主机<virtualhost></virtualhost>块内,.htaccess中无效 - 修改后必须
sudo systemctl reload apache2(Debian/Ubuntu)或sudo apachectl graceful(RHEL/CentOS)生效,硬重启非必需
单独设 LimitRequestLine 不够,必须配对限制
攻击者会绕过单一限制:比如把长数据塞进 Cookie 或 Authorization 头,触发 LimitRequestFieldSize 溢出。所以必须同步收紧:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
LimitRequestFieldSize 2048:单个 Header 最大长度,防 JWT Token 或恶意 Cookie -
LimitRequestFields 100:总 Header 数量上限,防重复提交数百个X-Trace-ID类字段 - 三者要一起写,缺一不可。只改
LimitRequestLine是假安全感
验证是否生效及常见失效原因
用 curl 发送超长 URI 测试:
curl -v "http://localhost:8080/$(printf 'a%.0s' {1..5000})"
预期返回 414 Request-URI Too Large。如果仍得 200 或 500,检查:
- 配置是否写在正确的上下文(
httpd.conf全局段 or<virtualhost></virtualhost>,而非.htaccess) - 是否遗漏
LimitRequestFieldSize,导致长 Cookie 触发不同错误(如 “Size of a request header field exceeds server limit”) - 是否启用了
mod_security等模块,其规则可能提前拦截并掩盖了 Apache 原生限制行为
最易忽略的是:AJP 连接 Tomcat 时,LimitRequestLine 在 Apache 端生效,但 AJP 协议自身有独立头长度限制(旧版默认约 64KB),需同步升级 Tomcat 并调优 maxHttpHeaderSize。

















