使用$request_uri配合limit_req_zone可对带参静态资源路径精准限流,因其保留完整原始URI(含query string),避免$uri去参导致的漏控;配置需在http块定义zone并设rate与burst,location中启用且推荐组合$binary_remote_addr增强精度。

直接用 $request_uri 配合 limit_req_zone,就能对特定静态路径(比如 /static/js/app.min.js、/images/banner.jpg)做精准限流,防止被恶意刷资源、拖垮带宽或触发源站压力。
为什么选 $request_uri 而不是 $uri?
$request_uri 保留完整原始请求路径(含 query string),比如 /logo.png?v=2.1.0 和 /logo.png?v=2.1.1 会被视为两个不同 URI;而 $uri 自动去除参数,两者会归为同一个 key。防刷静态资源时,带参 URL 很常见(缓存绕过、AB 测试等),用 $request_uri 更严谨,避免漏控。
基础配置写法(放在 http 块中)
在 nginx.conf 的 http{...} 区域添加:
limit_req_zone $request_uri zone=static_uri:10m rate=5r/s;
- zone=static_uri:10m:分配 10MB 共享内存,足够存约 16 万个不同 URI 的计数状态
- rate=5r/s:每个唯一 URI 每秒最多处理 5 次请求 —— 对图片、JS、CSS 这类静态资源已足够,远高于正常用户行为
在 location 中启用并控制突发行为
针对实际静态资源路径启用规则,例如:
location ~* \.(js|css|png|jpg|gif|ico|woff2?)$ {
limit_req zone=static_uri burst=10 nodelay;
expires 1y;
add_header Cache-Control "public, immutable";
}- 正则匹配常见静态后缀,确保只对真实资源生效
- burst=10:允许单个 URI 短暂突发 10 次请求(比如页面首次加载触发多个资源请求),避免误伤
- nodelay:不排队、不延迟,超限立即返回 503 —— 防止攻击者用慢速请求耗尽队列
进阶建议:组合 IP + URI 提升精度
若发现同一 URI 被多个 IP 同时高频请求(如 CDN 回源放大攻击),可改用组合 key:
limit_req_zone "$binary_remote_addr$request_uri" zone=ipuri_static:15m rate=3r/s;
- 内存占用略高,但能识别“IP A 刷 /a.js”和“IP B 刷 /a.js”为独立行为
- rate 可适当调低(如 3r/s),因为组合维度天然更严格
- 仍建议搭配
burst=5 nodelay,兼顾可用性与防御强度
验证与调优提示
- 查看 Nginx error log,搜索
limiting requests可确认拦截是否生效 - 用
ab -n 100 -c 20 http://your.site/logo.png快速模拟并发,观察是否出现 503 - 如果业务有合法批量请求(如监控探针轮询某张图),可在对应 location 中加
limit_req off;白名单绕过 - zone 大小别设太小:10m 是安全起点;若日志报
zone is full,说明内存不够,需扩容










