Nginx中可同时配置防盗链与限速策略以保护静态资源:先用valid_referers+if校验Referer合法性并返回403,再用limit_req限制单IP请求速率,最后用limit_rate控制单连接带宽,三者分层生效、互不干扰。

在 Nginx 的 location 块中同时配置防盗链与限速策略,是保护静态资源(如图片、视频、下载文件)最常用且高效的做法。关键在于分层控制:先校验请求来源合法性,再限制访问频次或带宽,两者互不干扰、可叠加生效。
一、基于 Referer 的基础防盗链
适用于大多数网站,防止外部站点直接嵌入你的图片或链接到你的资源文件。Nginx 自带 ngx_http_referer_module,无需额外编译。
- 在
location块中匹配目标资源后缀,例如:location ~* \.(jpg|png|gif|mp4|pdf|zip)$ - 使用
valid_referers定义合法来源,支持none(直接访问)、blocked(被防火墙过滤的 Referer)、域名通配(*.example.com)和精确域名 - 配合
if ($invalid_referer)判断并拦截,推荐返回403或重定向到提示页
示例配置:
location ~* \.(jpg|png|gif|mp4|pdf|zip)$ {
valid_referers none blocked *.mydomain.com mydomain.com;
if ($invalid_referer) {
return 403;
# 或 return 302 /forbidden.png;
}
}二、单 IP 请求速率限制(防刷/爬取)
防止恶意脚本高频请求同一资源,比如暴力下载或爬虫抓图。使用 limit_req 指令,依赖全局定义的共享内存区域。
- 先在
http块中定义限速区域,例如:limit_req_zone $binary_remote_addr zone=img_limit:10m rate=3r/s; - 在对应
location中启用该区域,并设置突发容量(burst)和是否立即拒绝(nodelay) - 建议对图片等轻量资源设较低速率(如 2–5 r/s),对下载类资源可放宽但配合连接数限制
示例配置(接上一段):
location ~* \.(jpg|png|gif|mp4|pdf|zip)$ {
valid_referers none blocked *.mydomain.com mydomain.com;
if ($invalid_referer) {
return 403;
}
limit_req zone=img_limit burst=6 nodelay;
}三、单连接带宽限制(防大流量盗链)
即使请求合法,也可能被高频下载拖垮带宽。用 limit_rate 控制每个连接的响应速度,单位为字节/秒(如 512k 表示 512 KB/s)。
- 该指令作用于当前
location下所有响应,对大文件(ZIP、MP4)特别有效 - 可结合
limit_rate_after实现“前几 MB 不限速,后续限速”,提升用户体验 - 注意:限速值不宜过低(如低于 64k 可能影响浏览器加载),也不宜过高(失去防护意义)
示例配置(用于下载目录):
location /download/ {
valid_referers none blocked *.mydomain.com mydomain.com;
if ($invalid_referer) {
return 403;
}
limit_rate 256k;
limit_rate_after 2m; # 前 2MB 不限速
}四、组合策略的注意事项
多个策略共存时需注意执行顺序和兼容性:
-
valid_referers + if是前置校验,失败即终止,不进入后续限速逻辑 -
limit_req在请求进入 location 后触发,受if影响;但limit_rate是响应阶段生效,不受if阻断影响 - 避免对同一 location 多次定义
limit_req,会导致配置冲突;如需多维度限速(IP + URI),应使用复合 key 定义 zone - 测试时用
curl -e "https://bad-site.com" http://your.site/image.jpg模拟盗链,用ab或wrk测试限速效果


















