能通过分析Nginx日志中的Referer字段识别盗链,但需先配置log_format包含$http_referer,再结合valid_referers白名单与if判断实时拦截,因Referer可伪造且易缺失,不可单独依赖。

直接看 Nginx 日志里的 Referer 字段,能快速发现谁在盗链——但光看不行,得结合配置和访问行为一起判断,才能真正防住。
先确认日志里有没有记录 Referer
默认 access_log 格式可能不包含 $http_referer。要让它显示,需自定义 log_format:
- 在 http 块中添加:log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
- 确保 access_log 指令用了这个格式,比如:access_log /var/log/nginx/access.log main;
- 重启 Nginx 生效后,每条日志末尾就会出现 Referer 值,例如:"https://bad-site.net/product.html" 或 "-"(表示为空)
从日志里识别典型盗链特征
重点关注静态资源路径(如 /images/、.jpg、.png)+ 异常 Referer 的组合:
- 陌生域名大量请求图片:比如日志中反复出现 GET /uploads/logo.png HTTP/1.1 + "https://shop-fake.com/item?id=123"
- Referer 为空但请求量突增:特别是来自爬虫 UA 或无头浏览器的请求,可能是脚本批量抓图
- HTTPS 页面引用 HTTP 资源:Referer 显示为 https://secure-site.com,但被请求的是 http://your-domain.com/photo.jpg —— 浏览器会清空 Referer,容易误判为盗链
- 搜索引擎 Referer 不稳定:百度、Google 的跳转页有时带 Referer,有时不带(尤其移动端),不能单凭一次缺失就拉黑
用日志分析结果反推并加固配置
发现盗链行为后,别急着加黑名单;优先更新 valid_referers 白名单,再验证效果:
- 把高频合法来源加进 valid_referers,比如合作站点:~\.partner-site\.com(注意点号要转义)
- 如果日志里大量 "-"(空 Referer) 来自正常用户(如微信内置浏览器、某些 App WebView),必须保留 none 选项
- 若发现盗链请求集中在某类 User-Agent(如 python-requests),可配合 map 指令做 UA 限流,不依赖 Referer
- 定期用 awk/grep 统计 Referer 分布:awk '{print $11}' access.log | sort | uniq -c | sort -nr | head -20,快速定位异常来源
注意日志分析的局限性
Referer 是浏览器发的,不是服务器生成的,所以它本身不可信:
- 日志里看到的 Referer 可被 curl、Postman 或恶意脚本伪造,不能当作唯一依据做拦截决策
- 隐私模式、部分浏览器扩展、HTTPS→HTTP 跳转都会导致 Referer 缺失或截断,真实用户也可能被误拦
- 日志只能告诉你“谁来了”,不能代替 Nginx 实时校验。真正起作用的是 valid_referers + if($invalid_referer) 这套组合,日志只是帮你调准白名单的尺子


















