在nginx中开启referer限制后,需自定义log_format并加入$http_referer变量记录来源,配合valid_referers实现“先记录后拦截”,再通过awk分析日志定位盗链站点。

在 Nginx 中开启 Referer 限制后,若想分析哪些来源在盗链,关键不是只靠 valid_referers 拒绝请求,而是要把实际的 Referer 请求头记录到 access_log 中——Nginx 默认日志格式不包含它,需要手动添加。
确保日志格式中包含 $http_referer
Nginx 的 $http_referer 变量会捕获客户端请求头中的 Referer 字段(注意拼写是 referer,不是 referrer)。你需要自定义 log_format,并在其中显式加入该变量:
- 编辑 nginx.conf,在
http块中定义新日志格式,例如:
log_format referer_log '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';- 然后在 server 或 location 块中启用该格式:
access_log /var/log/nginx/access.log referer_log;
重启或重载 Nginx(nginx -s reload)后,每条日志末尾就会出现 Referer 值,如 "https://evil-site.com/image.jpg" 或空字符串 "-"(表示无 Referer)。
注意 Referer 字段的常见取值含义
$http_referer 的值有几种典型情况,分析时需区分:
对设计或页面进行 WCAG 2.1 AA 无障碍审计。触发关键词:“audit accessibility”、 “check a11y”、 “is this accessible?” 或在审查设计时使用。
-
正常带 Referer:如
"https://example.com/page.html"—— 来源明确,可用于识别真实盗链站点 - 空 Referer(显示为 "-"):可能是直接访问、书签打开、HTTPS→HTTP 跳转被浏览器剥离,或恶意构造无 Referer 请求
- 非法或异常 Referer:如含空格、换行、超长字符串,Nginx 通常会自动截断或记为 "-",不影响日志写入但需在分析脚本中过滤
配合 valid_referers 实现“记录+拦截”双目标
仅记录 Referer 不够,你通常还想拦截非法请求。这时要让 valid_referers 和日志共存——Nginx 允许先记录再拒绝:
- 在 location 块中设置 Referer 白名单:
location ~ \.(jpg|png|gif|webp)$ {
valid_referers none blocked server_names *.mydomain.com;
if ($invalid_referer) {
return 403;
}
access_log /var/log/nginx/referer.log referer_log;
}这样,所有图片请求都会先记日志(含真实 Referer),再判断是否合法;非法请求也会出现在日志里(状态码为 403),方便你反查是谁在盗链、用什么 Referer 绕过。
日志分析建议(简单实用)
拿到含 Referer 的日志后,可用命令快速定位盗链源:
- 统计非空且非本站的 Referer(排除空值和自己域名):
awk '$11 != "-" && $11 !~ /mydomain\.com/ {print $11}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20- 筛选 403 请求中的 Referer:
awk '$9 == 403 && $11 != "-" {print $11}' /var/log/nginx/access.log | sort | uniq -c | sort -nr输出结果可直接用于更新白名单,或向盗链方发函。










