rewritecond 本身不支持限流,因其仅作静态条件判断,无计时器、计数器或历史请求记录能力;真正限流需依赖 mod_evasive、mod_qos、mod_security 或前置代理(如 nginx)。

Apache 的 RewriteCond 本身不支持限流(rate limiting),它只是条件判断指令,不能统计请求频次、维护计数器或阻塞连接。所谓“RewriteCond 限流重写”是常见误解——真正实现限流必须借助外部模块或前置组件。
为什么 RewriteCond 做不了限流
RewriteCond 只能检查静态状态:比如请求头、变量值、文件是否存在、或通过 RewriteMap 调用外部程序返回的单次结果。它没有内置计时器、没有内存计数器、也不记录历史请求。即使配合 RewriteRule,也无法对“同一 IP 每分钟最多 10 次”这类动态策略做实时判定。
可行的替代方案
要达成类似限流效果,需组合使用以下机制:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- mod_ratelimit(简单带宽限速):只能按字节/秒限制响应输出速度,不控制请求数,且已废弃,不推荐
-
mod_evasive(轻量级防刷):可拦截短时间高频请求(如每秒超 50 次),直接返回 403 或重定向到提示页。配置示例:
<ifmodule mod_evasive20.c><br> DOSPageCount 2<br> DOSSiteCount 50<br> DOSBlockingPeriod 60<br></ifmodule>
-
mod_qos 或 mod_security(规则级防护):支持基于 IP、URL、Header 的复杂限速策略,例如:
QS_SrvMaxConnPerIP 10(单 IP 最大并发连接)QS_LocRequestLimitMatch "^/api/" 30 60(/api/ 路径每分钟最多 30 次) -
前置代理层限流(生产推荐):在 Apache 前部署 Nginx / HAProxy / Cloudflare,它们原生支持令牌桶、漏桶算法。例如 Nginx:
limit_req_zone $binary_remote_addr zone=api:10m rate=5r/s;<br> location /api/ { limit_req zone=api burst=10 nodelay; }
若坚持用 Rewrite + 外部脚本模拟限流
仅适用于低频、非实时场景(如每日配额),需自行维护状态(如 Redis 或文件锁),并用 RewriteMap 调用脚本判断:
- 在
httpd.conf中定义:RewriteMap quota "prg:/usr/local/bin/check_quota.sh" - 脚本读取 IP 和当前时间,查数据库或文件判断是否超限,返回
OK或REJECT - 在 .htaccess 中写:
RewriteCond ${quota:%{REMOTE_ADDR}} =REJECT<br> RewriteRule ^(.*)$ /rate-limited.html [R=429,L]
注意:该方式性能差、易失效、难同步,仅作概念验证,不可用于高并发生产环境。
不复杂但容易忽略:限流是网络层或应用网关职责,Apache 定位是内容服务引擎,硬塞进 Rewrite 既低效又脆弱。










