需四层防护(来源识别、连接压制、速率控制、路径隔离)才能有效防盗链与爬取,禁用后缀匹配而用前缀/精确路径,结合map限速、limit_conn控并发,并可返回轻量提示图。

直接用 valid_referers 拦 Referer 只能防普通盗链,对批量爬取、多线程拖文件、CDN 回源穿透等场景基本无效。真正保护带宽,得把“来源识别”“连接压制”“速率控制”和“路径隔离”四层动作配齐,让恶意请求在不同阶段被卡住。
精准锁定要保护的资源路径
别用 location ~ \.zip$ 这类后缀匹配管整个下载服务——它无法区分页面内点击和脚本暴力拉取。必须显式圈定真实入口:
- 用前缀匹配,比如
^~ /download/或精确匹配= /api/v1/files,避免被上级通用规则覆盖 - 该 location 必须明确定义
root或alias,不继承可能绕过限制的配置 - 如果走 CDN 或负载均衡,记得提前用
set_real_ip_from和$http_x_forwarded_for修正客户端真实 IP
合法来源不限速,盗链者“下不动”
Nginx 不支持对 Referer 做条件限速,但可以用 map 把盗链标记转成限速值:
- 在
http { }块顶部定义白名单:valid_referers none blocked *.yourdomain.com yourdomain.com; - 紧接着用 map 映射:
map $invalid_referer $limit_rate_value { 1 "40k"; 0 "0"; } - 在对应 location 中启用:
limit_rate $limit_rate_value; limit_rate_after 5m;(前 5MB 不限速,兼顾预览和校验)
从连接源头掐断并发攻击
盗链工具常开 20–50 个连接同时拖大文件,单靠限速没用——连接一建就占内存和磁盘 I/O。必须在连接建立阶段拦截:
- 在
http { }块定义连接区:limit_conn_zone $binary_remote_addr zone=dl_conn:10m; - 在下载 location 中硬限制:
limit_conn dl_conn 2;(每个真实 IP 最多 2 个并发连接) - 若前端有反向代理,需配合
real_ip_header X-Forwarded-For;等指令还原真实 IP
返回轻量提示图代替 403
不想完全拒绝访问,可返回一张极小的提示图(如 1KB 的 PNG),既降低服务器压力,又起到警示作用:
- 准备一张
/images/hotlinking.png,大小控制在 1KB 内 - 在 location 中加:
rewrite ^/.*$ /images/hotlinking.png break; - 确保该图片 location 不受防盗链规则影响,单独配置或放白名单里











