referer防盗链核心是白名单校验机制:nginx通过valid_referers指令匹配http请求头中的referer字段,仅允许none、blocked、指定域名或正则匹配的来源访问静态资源,其余返回403;因referer可伪造,仅作基础防护,需配合签名url等增强安全。

理解Referer防盗链的核心逻辑
Referer防盗链本质是通过检查HTTP请求头中的Referer字段,判断请求是否来自白名单域名。Nginx在收到静态资源(如图片、CSS、JS、字体、视频等)请求时,可拦截非授权来源的访问并返回403或重定向到默认图。关键点在于:Referer可被客户端伪造,仅适用于防范普通盗链,不能替代鉴权;且空Referer(直接访问、HTTPS跳转到HTTP等场景)需显式处理。
基础配置:匹配白名单并拒绝非法来源
在server或location块中使用valid_referers指令定义合法来源,再结合if判断执行拦截:
- 支持域名通配(
*.example.com)、精确匹配(example.com)、正则(~\.google\.) - 必须包含
none以允许空Referer(如用户直接输入URL访问) - 必须包含
blocked以允许被防火墙或隐私插件移除Referer的请求 - 示例配置:
location ~* \.(jpg|jpeg|png|gif|webp|css|js|woff2|ttf|mp4|avi)$ {
valid_referers none blocked *.mycompany.com myapp.net;
if ($invalid_referer) {
return 403;
# 或重定向:rewrite ^/.*$ /static/forbidden.png last;
}
}
进阶控制:按资源类型差异化策略
不同静态资源敏感度不同,可分location精细化管理:
- 高敏感资源(如后台图标、内部文档PDF):仅允许可信子域,禁用空Referer
- 公开资源(如官网Banner图):允许主站+合作站点+空Referer
- CDN回源场景:若使用CDN,需把CDN节点IP的Referer(实际为CDN域名)加入白名单,或关闭CDN的Referer透传
- 避免在根location使用if——易引发重写循环或覆盖其他指令
调试与避坑要点
常见问题及应对方式:
-
HTTPS页面引用HTTP资源:浏览器会清空Referer,导致误拦截 → 统一协议或在valid_referers中加
https://http://前缀(Nginx 1.19+支持) - 移动端WebView或小程序:部分环境Referer为空或不可靠 → 可配合User-Agent简单识别,或改用Token签名方案
-
日志验证:开启log_format记录
$http_referer和$status,确认拦截是否生效 - 不建议用Referer做登录态校验:它不是安全边界,仅作辅助防护层











