Apache本身不支持基于请求行为的原生访问控制,需组合mod_rewrite、mod_setenvif等模块将行为特征转为环境变量,再通过Require或[F]实施拦截,并可对接fail2ban实现多请求上下文的自动封禁。

Apache 本身不直接提供“基于请求行为”(如访问频率、请求头异常、参数模式、Referer 变化等)的原生访问控制机制,但可通过组合 mod_rewrite、mod_setenvif、mod_headers 和外部工具(如 fail2ban)实现行为级拦截。关键在于把“行为特征”转化为可识别的环境变量或条件,再交由访问控制指令(如 Require 或 Deny)执行动作。
用 SetEnvIf 捕获请求特征并标记
该模块可根据请求头、URL、User-Agent 等字段动态设置环境变量,是行为识别的第一步:
- 屏蔽已知恶意爬虫:
SetEnvIf User-Agent "(sqlmap|nikto|dirb)" block_bot - 限制无 Referer 的敏感接口访问:
SetEnvIf Referer "^$" no_referer - 识别非常规请求方法(如 TRACE、TRACK):
SetEnvIf REQUEST_METHOD "^(TRACE|TRACK)$" bad_method - 匹配可疑 URL 参数(如含
eval(、base64_decode):SetEnvIf Request_URI "(eval\(|base64_decode|phpinfo)" suspicious_param
设置后,这些变量(如 block_bot)即可在后续访问控制中引用。
结合 Allow/Deny 或 Require 实施拦截
根据 Apache 版本选择对应语法:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
Apache 2.2(旧版):在
<Directory>或<Location>中使用Order Allow,Deny<br>Allow from all<br>Deny from env=block_bot<br>Deny from env=suspicious_param
-
Apache 2.4+(推荐):使用
Require表达式Require all granted<br>Require not env block_bot<br>Require not env suspicious_param
也可写成单行:Require expr %{ENV:bad_method} != '1'
用 mod_rewrite 做更灵活的行为响应
当需返回特定状态码、重定向或记录日志时,RewriteRule 更适合:
- 直接拒绝并返回 403:
RewriteCond %{ENV:block_bot} 1<br>RewriteRule ^ - [F] - 对高频请求(如 10 秒内超 5 次)限流(需配合 mod_evasive 或 mod_qos):
单独靠 rewrite 无法计数,但可触发外部脚本或与 fail2ban 配合封 IP - 拦截带危险参数的 GET 请求:
RewriteCond %{QUERY_STRING} (?:%3C|%3E|<|>|javascript:|alert\() [NC]<br>RewriteRule ^ - [F]
补充:对接 fail2ban 实现自动 IP 封禁
若行为具备持续性(如暴力扫描、爆破),建议将日志特征写入 access_log,再用 fail2ban 监控并调用 iptables 或修改 Apache 的 Deny 规则:
- 在
LogFormat中加入环境变量:LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" %{block_bot}e" combined - fail2ban 的 filter 可匹配
block_bot=1并触发封禁动作
这类方案不依赖单次请求判断,而是基于多请求上下文做决策,真正贴近“行为控制”本质。

















