nginx防盗链不直接防恶意采集,但可通过referer限制、user-agent过滤、限速及动态封禁组合策略有效遏制爬虫和非法抓取。1. valid_referers设白名单并拦截无效referer;2. map匹配恶意ua并return 403;3. limit_req按ip+uri限速防暴力采集;4. 结合日志分析与geo模块实现动态封禁。

Nginx 防盗链本身不直接防“恶意采集”,但可通过限制 Referer、配合 User-Agent 过滤、限速和访问控制等手段,有效遏制批量爬虫和非法镜像抓取。关键不是单靠一个配置,而是组合策略。
1. 基础 Referer 防盗链(防直接嵌套引用)
适用于防止他人在网页中 <img src="your-domain.com/xxx.jpg"> 直接盗用资源。注意:Referer 可伪造,仅作第一道门槛。
- 在 server 或 location 块中添加:
valid_referers none blocked server_names *.example.com example.com;
if ($invalid_referer) {
return 403;
# 或返回默认图:rewrite ^/.*\.(jpg|jpeg|png|gif)$ /nolink.png break;
}
说明:none 允许直接访问(如用户手动输入 URL),blocked 拦截被篡改或无 Referer 的请求(部分爬虫会清空 Referer),server_names 白名单域名。避免写成 valid_referers none;,否则所有外部请求都会被放行。
2. 拦截常见采集 User-Agent
很多通用爬虫(如 python-requests、curl、wget、扫描器)有固定 UA 特征,可针对性封禁。
- 在 http 或 server 块中定义黑名单:
map $http_user_agent $bad_ua {
default 0;
"~*python|curl|wget|httperf|apachebench|java|okhttp|synapse" 1;
"~*scanner|spider|crawler|bot" 1;
}
- 在 location 中应用:
if ($bad_ua) {
return 403;
}
注意:不要盲目屏蔽所有含 “bot” 的 UA(如百度、谷歌搜索蜘蛛),应结合日志分析真实恶意 UA;也可用 ~* 忽略大小写匹配。
3. 对高频请求做限速(防暴力采集)
即使 UA 和 Referer 合法,异常高频访问也可能是采集行为。建议按 IP + 路径维度限速。
- 在 http 块定义限速区:
limit_req_zone $binary_remote_addr zone=perip:10m rate=5r/s; limit_req_zone $binary_remote_addr$uri zone=peripuri:10m rate=2r/s;
- 在图片/接口 location 中启用:
location ~* \.(jpg|jpeg|png|gif|js|css|pdf)$ {
limit_req zone=peripuri burst=3 nodelay;
limit_req_status 429;
}
说明:每秒最多 2 次相同 URI 请求,突发允许 3 次,超限返回 429。比全局限速更精准,不影响首页或 HTML 访问。
4. 配合日志与动态封禁(进阶)
单纯静态规则易绕过。建议定期分析 access.log,识别异常 IP 段或路径模式,再通过 geo 模块或第三方模块(如 nginx-module-vts)联动防火墙或自动封禁。
- 示例:临时屏蔽某 IP 段(写入 geo map):
geo $bad_ip {
default 0;
192.168.100.0/24 1;
203.0.113.42 1;
}
if ($bad_ip) {
return 403;
}
提示:生产环境建议用 fail2ban 或自建脚本解析日志,将恶意 IP 写入该 geo 文件并 reload nginx,实现半自动响应。
不复杂但容易忽略的是:所有规则都要配合日志验证效果,上线前先用 access_log /var/log/nginx/bad.log main if=$invalid_referer; 单独记录拦截情况,避免误伤正常用户。











