防盗链仅校验referer,需与限流、连接限制、自动降级分层配合:高价值下载资源须独立location,正则匹配后缀;启用limit_req(3r/s)和limit_conn(3并发),nodelay防积压;503时降级返回json;valid_referers兼容空referer及子域。

防盗链本身不防压垮,只拦来源;真正扛不住流量冲击的,是后端静态资源服务器。要让防盗链资源不被刷崩,得把防盗链、限流、降级三者分层配合,各司其职,不能堆在一个 location 里硬塞。
按资源类型拆分 location,明确防护边界
高价值可下载资源(如 /download/*.pdf、/res/*.zip)必须单独定义 location 块,避免和页面 JS/CSS 混用同一套规则:
- 用正则精准匹配后缀:
location ~* ^/download/.*\.(pdf|zip|exe|mp4)$ - 防盗链只管 Referer 合法性,不参与速率判断
- 限流(
limit_req)和连接限制(limit_conn)必须在这个 location 内启用,且作用于真实客户端 IP($binary_remote_addr) - 不给这个 location 加
proxy_cache或缓存头,防止缓存污染或绕过限流
防盗链后立即加请求限流,堵住“合法来源+高频刷”漏洞
攻击者拿到白名单域名后,可能用脚本疯狂刷 PDF 下载链接。仅靠 valid_referers 拦不住,必须叠加速率控制:
- 在 http 块定义限流区:
limit_req_zone $binary_remote_addr zone=dl_rate:10m rate=3r/s(每秒最多 3 次) - 在 download location 中启用:
limit_req zone=dl_rate burst=5 nodelay -
nodelay关键:超限立刻返回 503,不排队,避免请求积压拖垮 Nginx 进程 - burst=5 允许短时点击行为(比如用户点开页面瞬间加载多个附件),但不会纵容爬虫
并发连接限制 + 自动降级兜底,防大文件拖拽与雪崩
单个用户开 20 个线程拖 MP4,即使每秒只发 1 个请求,也能耗尽带宽和连接数。这时要上第二道防线:
- 定义连接限制区:
limit_conn_zone $binary_remote_addr zone=dl_conn:10m - 在 location 中限制:
limit_conn dl_conn 3(同一 IP 最多 3 个并发连接) - 对下载路径启用自动降级:
error_page 503 = @dl_fallback - 配置降级响应:
location @dl_fallback { internal; return 200 '{"code":503,"msg":"下载繁忙,请稍后再试"}'; } - 配合
proxy_cache_use_stale error timeout http_503,当后端挂掉时仍能返回最近一次成功响应
监控与误判兜底:留空 Referer 和子域兼容性不能少
防盗链规则太严会误杀微信内嵌页、邮件客户端、PWA 等合法空 Referer 场景:
valid_referers none blocked *.yourdomain.com yourdomain.com;-
none允许直接粘贴 URL 访问(分享场景) -
blocked兼容钉钉、飞书、企业微信等屏蔽 Referer 的环境 - 不写
www.yourdomain.com而写*.yourdomain.com,覆盖所有子域(cdn、admin、app) - 禁用手动 if 判断
$http_referer,只依赖$invalid_referer变量,更安全可靠











