必须在虚拟主机中配置LimitRequestLine以防御超长URL攻击,因其默认值8190字节过高,仅全局配置无法覆盖重定向、WebDAV等场景;推荐设为2048–4096,并配合LimitRequestFieldSize和LimitRequestFields使用。
在虚拟主机中配置 limitrequestline 是防御超长 url 导致的缓冲区溢出或解析崩溃最直接有效的手段。它不是可选功能,而是 apache 对请求行(如 get /a...a http/1.1)长度的硬性截断机制。
为什么必须在虚拟主机里配,不能只靠全局默认
Apache 默认 LimitRequestLine 为 8190 字节,远超业务所需。攻击者可构造上万字符的路径触发内存耗尽、解析失败甚至子进程崩溃。若仅依赖主配置而未在虚拟主机中显式设置,一旦该虚拟主机处理含长参数的重定向、WebDAV 或代理转发请求,风险会集中暴露。
正确配置步骤(仅需三步)
- 打开对应虚拟主机配置文件,例如
/etc/apache2/sites-available/example.com.conf,定位到<VirtualHost *:80>或<VirtualHost *:443>块内 - 在块内任意位置(通常放在 DocumentRoot 下方)添加一行:
LimitRequestLine 4096
推荐值范围是 2048–4096;2048 覆盖绝大多数 REST API 和带中等长度查询参数的页面,4096 更兼容含 JWT 或多级嵌套路由的前端应用 - 保存后执行
sudo apache2ctl configtest确认语法无误,再重启服务:sudo systemctl restart apache2
关键注意事项
- 该指令不支持 .htaccess,写在里面完全无效,Apache 启动时也不会报错,容易误以为已生效
- 如果使用
mod_proxy反向代理,LimitRequestLine只作用于接入层请求;后端服务(如 Tomcat、Node.js)仍需各自设防,不能依赖 Apache 一层拦截 - 上线前务必抽样检查真实流量:用
awk '{print length($0)}' /var/log/apache2/access.log | sort -n | tail -5查看最长请求行字节数,或用%r格式日志字段统计LogFormat "%h %l %u %t \"%r\" %>s %O" combined - 某些旧版 IoT 设备或 Java SDK 可能生成略超 4096 的合法请求,若发现误拒,可临时调至 6144 并观察日志,但不应长期设为 8190 或更高
搭配其他 Limit 指令才完整
单设 LimitRequestLine 不够。攻击者可能改用超长 Header 或海量 Header 绕过:
-
LimitRequestFieldSize 2048:限制单个请求头(如 Authorization、Cookie)最大长度,防 Base64 Token 溢出 -
LimitRequestFields 40:限制 Header 总数,防头数量爆炸耗尽内存 - 这三个指令建议统一写在同一个
<VirtualHost>块中,避免防御缺口

















