Apache mod_rewrite的[F]标志仅能返回403响应,无法原生限频,须结合日志分析脚本生成临时封禁规则,属分钟级离线防护,适用于虚拟主机等受限环境。
在虚拟主机层级无法直接使用 mod_evasive 或 mod_security 等模块进行动态封禁时,利用 mod_rewrite 的 [f] 标志(forbidden)可实现**简单、轻量、无需额外模块**的基于请求频次的粗粒度封禁。但需明确:mod_rewrite 本身不记录或统计访问次数,它不能原生实现“频次控制”,必须借助外部机制(如日志分析+临时规则生成)协同完成。以下是可行且实用的实现路径。
理解 F 标志的真实作用与局限
[F] 标志会让 Apache 直接返回 HTTP 403 Forbidden 响应,不执行后续规则,也不进入 PHP 或其他处理器。它不是防火墙规则,不阻断 TCP 连接,不写入系统 iptables,也不实时计数。因此:
- 它只能对已知的、预定义的条件(如 IP、User-Agent、URL 模式)触发封禁;
- 无法自动识别“1 秒内请求 50 次”这类动态行为;
- 必须配合外部脚本周期性分析访问日志,生成并加载临时封禁规则。
构建“日志分析 + RewriteRule 生成”闭环
核心思路:用 shell 脚本定时扫描 access_log,识别高频恶意 IP,将其写入一个独立的 .htaccess 片段(如 _blocked_ips.conf),再通过主配置或 .htaccess 包含该文件。
- 在虚拟主机配置中(或根目录 .htaccess),添加:
RewriteMap blockedip txt:/path/to/_blocked_ips.conf
(注意:RewriteMap 仅在主配置或 httpd.conf 中允许,共享虚拟主机通常禁用此指令;若不可用,则改用 include 方式) - 更兼容虚拟主机的做法是:脚本生成含 RewriteRule 的片段,例如:
RewriteCond %{REMOTE_ADDR} ^192\.168\.1\.100$ [OR]RewriteCond %{REMOTE_ADDR} ^203\.0\.113\.42$RewriteRule ^ - [F]
然后在主 .htaccess 末尾用Include /path/to/_auto_blocked.rules(需 Apache 启用AllowOverride All且支持 Include) - 脚本示例逻辑(每 5 分钟运行):
awk '{ip[$1]++} END {for (i in ip) if (ip[i] > 200) print "RewriteCond %{REMOTE_ADDR} ^" i "$ [OR]"}' /var/log/apache2/access.log | sed 's/\[OR\]$/[F]/' > /path/to/_auto_blocked.rules
用环境变量 + RewriteCond 实现轻量会话级限速(有限适用)
若仅需对单个 URL(如登录页)做极简防护,可结合 RewriteCond 对请求头或 Cookie 的判断,配合外部标记(如 PHP 写入临时文件或 Redis),再由 rewrite 读取判断:
- PHP 在检测到异常提交时,写入:
file_put_contents('/tmp/blocked_'. $_SERVER['REMOTE_ADDR'], time()); - .htaccess 中:
RewriteCond /tmp/blocked_%{REMOTE_ADDR} -fRewriteCond %{TIME_UNIX} ^(\d+)$RewriteCond /tmp/blocked_%{REMOTE_ADDR} ^(\d+)$RewriteCond %2 ^(\d+)$RewriteCond %1 -gt %2RewriteRule ^login\.php$ - [F]
(注:Apache 2.4+ 支持 -f 和数值比较;实际需用RewriteMap或expr更可靠,但虚拟主机常受限)
重要提醒与替代建议
该方案本质是“离线封禁”,存在分钟级延迟,且无法应对 IP 池或代理穿透。生产环境应优先考虑:
- 升级至支持
mod_evasive或mod_ratelimit的 VPS/独立服务器; - 使用 CDN 层(如 Cloudflare)开启速率限制和 WAF 规则;
- 在应用层(PHP/Python)用 Redis 实现毫秒级频控,再配合 403 响应;
- 若虚拟主机提供商支持,申请启用
mod_security并配置自定义规则。
单纯依赖 .htaccess + [F] 无法替代真正的实时防护,但它作为低成本应急手段,在特定约束下仍具操作价值。

















