Apache ModSecurity配置:按资源每秒限制请求并跳转
搞定ModSecurity按资源限流并重定向的配置
嘿,我来帮你完善这个ModSecurity的配置,正好匹配你要的每秒每个.dimg资源最多10次请求、超额请求直接重定向的需求~
直接可用的完整配置
<LocationMatch "(.*)\.dimg(.*)"> # 初始化资源专属的计数集合,用请求URI当唯一标识,每个.dimg资源单独计数 SecAction phase:1,initcol:resource=%{REQUEST_URI},pass,nolog,id:132 # 每次请求给当前资源的计数+1,同时设置1秒后计数重置——实现"每秒"的限流窗口 SecAction phase:1,setvar:resource.COUNT=+1,expirevar:resource.COUNT=1,pass,nolog,id:133 # 要是计数超过10,直接重定向到你指定的页面 SecRule RESOURCE:COUNT "@gt 10" "phase:1,redirect:https://your-target-page.com,status:302,pass,nolog,id:134" # 调试用的日志级别,上线记得调低或者关掉 SecDebugLogLevel 3 </LocationMatch>
给你拆解下关键部分
phase:1:把规则放在请求处理的最早期(请求头阶段),比你之前用的phase:2更高效,能更早处理限流逻辑initcol:resource=%{REQUEST_URI}:给每个不同的.dimg资源单独建一个计数容器,比如/a.dimg和/b.dimg的计数是完全分开的,正好符合你“按资源”限流的要求setvar+expirevar:每次请求给当前资源计数加1,同时告诉ModSecurity“1秒后把这个计数清零”,这样就刚好实现了“每秒最多10次”的限制redirect指令:把https://your-target-page.com换成你实际要跳的页面就行,status:302是临时重定向,适合这种限流场景pass,nolog:保证正常请求不受影响,也不会打一堆日志占空间,调试的时候可以改成log方便排查问题
几个要注意的点
- 你的ModSecurity版本得是2.8及以上,不然
expirevar指令用不了 - 要是需要更精准的滑动窗口限流(比如不是整秒重置,而是滚动的1秒窗口),可以结合时间变量再调整,但你要的“每秒10次”用上面的配置完全够
- 调试的时候可以把
SecDebugLogLevel改成9,上线记得调回3或者直接关掉,不然日志会爆 - 测试的时候可以用
ab -n 20 -c 5 https://your-domain/test.dimg这种命令模拟并发请求,看看超过10次后是不是会跳转到指定页面
内容的提问来源于stack exchange,提问作者Nastya
相关产品推荐
相关产品推荐

