需四层联动防护下载服务:①精准匹配路径(如^~ /download/);②valid_referers+map实现盗链限速;③limit_conn限制ip并发连接;④可选if返回提示图或403。

要限制特定大文件下载服务的盗链与带宽恶意消耗,不能只拦 Referer,也不能只限速——得把“来源识别”“连接压制”“速率控制”和“路径隔离”四层逻辑串起来,让盗链者要么连不上,要么连上了也下不动。
精准匹配下载服务路径
先锁定你要保护的真实入口,比如 /download/、/api/v1/files/ 或 /chunks/。必须用前缀匹配(^~ /download/)或精确匹配(= /api/v1/files),避免被通用 location 覆盖。
- 不要用
location ~ \.zip$这类后缀匹配来管整个下载服务,它无法区分合法页面内点击和外部脚本批量拉取 - 确保该 location 显式指定
root或alias,且不继承可能绕过规则的上级配置
用 valid_referers + map 实现“盗链即限速”
Nginx 本身不支持对 Referer 做条件限速,但可以通过变量映射间接实现:
- 在
http { }块顶部定义白名单并生成$invalid_referer:valid_referers none blocked *.yourdomain.com yourdomain.com;
- 紧接着用
map将盗链标记转为限速值:map $invalid_referer $limit_rate_value { 1 "40k"; # 盗链者:40KB/s(约320Kbps),基本无法完成下载 0 "0"; # 合法来源:不限速 } - 在对应
location中启用:limit_rate $limit_rate_value; limit_rate_after 5m; # 前 5MB 不限速,兼顾首屏预览和校验
防多线程暴力拖取:按 IP 限并发连接
盗链工具常开 10–50 个连接并发下载,单靠限速没用——连接一建就占磁盘 I/O 和内存。必须在连接建立阶段拦截:
- 定义连接限制区(放在
http { }):limit_conn_zone $binary_remote_addr zone=dl_conn:10m;
- 在下载 location 中启用硬限制:
limit_conn dl_conn 2; # 每个真实 IP 最多 2 个并发连接
若前端有 CDN 或 LB,需配合
set_real_ip_from和$http_x_forwarded_for,否则所有用户会被当成同一个 IP
可选增强:返回轻量提示或拦截重定向
不想让盗链者完全卡死,可以返回一张极小的提示图(如 1KB 的 PNG):
if ($invalid_referer) {
rewrite ^(.*)$ /static/forbidden.png break;
}
或直接返回 403:
if ($invalid_referer) { return 403; }
注意:if 必须紧跟 valid_referers,且不要在里面写 proxy_pass 或复杂逻辑,易出错。
不复杂但容易忽略











