Nginx防盗链(valid_referers)仅适用于静态资源防盗链,因Referer可伪造,无法有效防御爬虫;防爬虫应使用User-Agent过滤、限流等机制,二者原理不同、不可混用。

Nginx 本身不直接用于防范自动化爬虫抓取,它的防盗链(valid_referers)机制只校验 HTTP 请求头中的 Referer 字段,而爬虫多数情况下根本不带 Referer,或可随意伪造,因此用防盗链来防爬虫是错配场景——这不是瓶颈问题,而是原理性失效。
真正要测试的是:你误用了防盗链规则去防爬虫,结果既拦不住爬虫,又误伤了合法用户(如搜索引擎、微信内嵌浏览器、PWA 等)。下面分三块说清楚:
一、为什么防盗链对爬虫基本无效
防盗链依赖 Referer,但:
- 命令行工具(curl、wget)、Python requests 默认不发 Referer;
- 主流爬虫框架(Scrapy、Playwright、Selenium)可自由设置任意 Referer,甚至清空;
- 搜索引擎爬虫(Googlebot、Bingbot)通常不带 Referer,会被你的
valid_referers none blocked放过——但若你漏配none,反而会把它们 403 掉; - 手机 App、微信/QQ 内嵌 WebView 访问图片时,Referer 常被截断或为空,容易被误杀。
二、如何快速验证你是否“误用防盗链防爬虫”
在 Nginx 配置中找这类典型错误写法:
-
valid_referers none blocked yourdomain.com;—— 表面看合理,但没加子域名(*.yourdomain.com),微信分享页可能来自mp.weixin.qq.com,Referer 是空或被屏蔽,none和blocked能兜住;但如果加了if ($invalid_referer) { return 403; },就等于把所有无 Referer 的请求(含真实爬虫、API 调用、监控探测)全拒了; - 把防盗链规则放在
location /或location ~ \.(js|css|html)$下——这会拦截 HTML 页面本身,导致搜索引擎无法抓取首页,属于严重误配; - 用防盗链去保护
.pdf、.zip文件,却没考虑业务需求:比如公开下载页需支持站外跳转下载,此时 Referer 就是来源站点,必须白名单放行。
三、防爬虫该用什么?Nginx 中真正有效的做法
如果你的目标是防自动化抓取,Nginx 里应启用以下机制,而非 Referer 校验:
-
User-Agent 黑名单:
if ($http_user_agent ~* (Scrapy|Go-http-client|curl|python-requests|HeadlessChrome)) { return 403; }
注意:仅封明显特征,避免误杀 Chrome/Firefox 正常请求; -
请求频率限制(rate limiting):
在http块定义限流区:limit_req_zone $binary_remote_addr zone=anti_crawl:10m rate=2r/s;
在图片/接口 location 中启用:limit_req zone=anti_crawl burst=5 nodelay; -
Referer + UA + 请求路径组合判断(进阶):
比如只对/api/v1/data接口要求 Referer 必须为自身域名,同时 UA 不能是 curl;
单独对静态资源(location ~* \.(jpg|png|pdf)$)仍用 Referer 白名单,但不混用防爬逻辑。
不复杂但容易忽略:防盗链和防爬虫是两类问题,一个管“谁在引用我的图”,一个管“谁在高频刷我的数据”。混着配,规则越多,越容易自缚手脚。


















