mod_rewrite 无法单独实现基于频次的IP封禁,需配合fail2ban等外部机制;它仅能静态拦截恶意请求、标记可疑行为供日志分析,或辅助mod_evasive缩小监控范围。

mod_rewrite 本身不统计访问频次,也不能自动封禁 IP。它没有计数器、没有状态存储、不记录历史请求——所以仅靠 RewriteRule ... [F] 无法实现“基于频次”的动态屏蔽。
你真正需要的,是把 mod_rewrite 当作一个触发器或过滤器,配合其他机制完成“频次识别 → 封禁动作”闭环。下面分三类实用路径说明:
✅ 场景一:用 Rewrite 拦截已知恶意模式(静态规则,非频次)
适用于明确特征的攻击请求,比如含 cmd=、phpinfo、.env、base64 编码参数等。
# 阻止常见命令执行参数(大小写不敏感)
RewriteCond %{QUERY_STRING} (cmd|exec|system|passthru|eval)= [NC]
RewriteRule ^ - [F]
# 阻止访问敏感文件(路径匹配)
RewriteRule \.(env|htaccess|gitignore|log|bak|sql)$ - [F,NC]
# 阻止 base64 编码绕过(需先解码?Apache 不自动解码,但可匹配编码格式)
RewriteCond %{QUERY_STRING} [a-zA-Z0-9+/]{20,}={0,2} [NC]
RewriteRule ^/api/ - [F]
⚠️ 注意:
[F]返回 403,但不记录、不计数、不封 IP,只是单次拦截。
✅ 场景二:用 Rewrite 标记 + 日志 + fail2ban 实现频次封禁(推荐)
这是生产环境最可靠的方式:mod_rewrite 负责打标签,fail2ban 负责分析日志并封 IP。
步骤:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 在 Apache 配置中添加自定义日志标记:
# 匹配可疑参数,写入特殊日志行(便于 fail2ban 提取)
RewriteCond %{QUERY_STRING} (debug=true|token=.*[a-f0-9]{32}|shell=) [NC]
RewriteRule ^ - [E=BADREQ:1]
# 自定义日志格式,包含标记字段
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{BADREQ}e" combined_with_flag
CustomLog /var/log/apache2/access.log combined_with_flag
- 配置 fail2ban filter(
/etc/fail2ban/filter.d/apache-badreq.conf):
[Definition] failregex = ^<host> .* \"\S+ \S+ HTTP.*\" .* \"[^\"]*\" \"[^\"]*\" 1$ ignoreregex =</host>
- 启用 jail(
/etc/fail2ban/jail.local):
[apache-badreq] enabled = true filter = apache-badreq logpath = /var/log/apache2/access.log maxretry = 5 findtime = 300 bantime = 3600
✅ 效果:同一 IP 5 分钟内触发 5 次带
debug=true的请求 → 自动 iptables 封禁 1 小时,可审计、可解封、不误伤。
✅ 场景三:用 Rewrite 配合 mod_evasive 做“伪频次”增强
mod_evasive 是真正在做频次检测的模块,但它的阈值是全局的(如“单页 1 秒超 10 次”)。你可以用 mod_rewrite 提前缩小监控范围,减少误触:
# 只对 /admin/ 和 /api/ 路径启用 mod_evasive 计数(需配合其 DOSSiteCount 等设置)
<location>
SetEnvIf Request_URI ".*" DOSCounter=1
</location><location>
SetEnvIf Request_URI ".*" DOSCounter=1
</location>
然后在 mod_evasive 配置中加:
DOSWhitelist 127.0.0.1 # 只对带 DOSCounter=1 的请求计数(需自行 patch 或用第三方扩展,原生不支持条件计数)
⚠️ 原生 mod_evasive 不支持按路径开启/关闭计数,此方案需额外脚本或改用 mod_security + SecAction 实现更精细控制。
不复杂但容易忽略:mod_rewrite 是“开关”,不是“计数器”。要防频次攻击,必须引入外部状态系统——fail2ban 是当前最成熟、可运维的选择。









