Nginx通过Referer白名单、internal指令、限速缓存及路径隐藏等组合策略实现静态资源防护:valid_referers筛除无Referer或非法来源请求并返回403;internal锁死私有资源直达入口;对图片/JS/CSS等设置速率限制与强制缓存;路径采用哈希或时间戳避免爆破;结合Fail2ban动态封禁异常IP,并通过日志监控识别爬虫行为。

静态资源服务本身不带逻辑,但恰恰是爬虫最常盯上的目标——图片、JS、CSS、PDF 等文件体积小、易批量下载、又常被直接暴露路径。Nginx 防住这类抓取,关键不是“彻底禁止”,而是让恶意行为无利可图、成本陡增、且不影响真实用户访问。
用 Referer 白名单防懒人盗链和基础爬虫
大量低质量爬虫不会伪造 Referer,或直接构造 URL 批量请求。Nginx 的 valid_referers 指令能快速筛掉这类请求:
- 只允许来自你自己的域名(含 www 和非 www)及可信 CDN 域名访问静态资源
- 明确拒绝空 Referer(
none)和非法来源(blocked),返回 403 - 注意:Referer 可被伪造,所以它防的是“顺手抄链接”的爬虫,不是高级攻击者
用 internal 指令锁死私有资源的直达入口
对用户头像、后台导出报表、临时上传文件等绝不该被浏览器地址栏打开的资源,必须用 internal:
- 配置 location 块时加上
internal;,Nginx 会主动拒绝所有外部发起的 GET/HEAD 请求 - 只有通过
rewrite ... last、error_page或后端通过X-Accel-Redirect触发的内部跳转才能访问 - 这比靠权限判断更底层、更可靠,连 HTTP 状态码都不会发出去
结合限速与缓存,抬高批量抓取门槛
光封 UA 或 Referer 不够,得让高频请求“卡住”或“变慢”:
- 对
.jpg/.png/.js/.css等扩展名单独设置宽松但有限的速率限制,例如rate=100r/s,避免影响页面加载,但压制单 IP 每秒几百次的扫图行为 - 强制缓存静态资源(
Cache-Control: public, max-age=31536000),让 Nginx 直接响应,不打后端;同时缓存命中本身就能稀释爬虫的真实请求数 - 对疑似恶意行为(如 10 分钟内触发 50+ 次 404)用 Fail2ban 动态封 IP,形成闭环
隐藏路径 + 日志监控,让爬虫找不到下手点
静态资源路径越直白,越容易被猜到和爆破:
- 避免把敏感资源放在
/uploads/、/images/这类通用目录下;改用带哈希或时间戳的路径,如/static/img/20260629_a7f3b2.png - 在 access_log 中加入
$http_user_agent和$status字段,定期分析日志里高频 200 的 UA 和路径,及时发现新出现的爬虫指纹 - 对反复扫描
/favicon.ico、/robots.txt后立刻扫/admin/的行为,视为可疑,可提前介入


















