应通过Nginx的valid_referers白名单精准限制Referer,仅允许可控域名及子域名,禁用none/blocked,匹配图片视频后缀或路径,返回防盗链提示图并补充安全响应头,结合日志监控与主动测试验证效果。

要对图片和视频资源实施严格的防盗链保护,关键在于精准识别请求来源、拒绝非法引用,并兼顾真实用户访问场景(比如直接输入URL、HTTPS跳转丢失Referer等)。Nginx 本身不支持“绝对严格”的防盗链(因Referer可被伪造或缺失),但通过合理组合 valid_referers 参数与响应策略,可达到生产环境所需的高防护等级。
明确受保护的资源类型与位置
先锁定需防护的静态资源路径和后缀。图片常见格式包括 .jpg、.jpeg、.png、.gif、.webp、.avif;视频常见格式有 .mp4、.webm、.mov、.flv、.m3u8(注意:m3u8+ts流需额外考虑Referer透传问题)。
推荐在 location 块中单独定义规则,避免影响动态接口:
- 用正则匹配资源后缀,例如:
location ~* \.(jpg|jpeg|png|gif|webp|avif|mp4|webm|mov|flv|m3u8)$ - 若资源统一放在
/static/或/media/路径下,也可按路径匹配:location ^~ /static/,再配合内部if判断后缀 - 确保该 location 位于正确的
server块内,且优先级高于泛用的location /
配置高安全等级的 valid_referers 白名单
“严格”体现在白名单范围最小化、拒绝逻辑无例外。不建议使用 none 或 blocked——它们会放行空Referer或被屏蔽的Referer,易被绕过(如书签访问、微信内嵌浏览器、部分PWA场景)。
应只允许你实际控制的域名及其子域名,并禁用通配符过度授权:
- 写死主域名和必需子域名,例如:
valid_referers server_names *.your-site.com your-site.com; - 如果有多套前端(如
app.your-site.com、blog.your-site.com),全部显式列出,不依赖*自动匹配 - 禁用
none和blocked,除非你明确接受直接访问(如分享链接图);若必须保留,请后续用if ($invalid_referer && $args !~ "direct=1")等条件做二次过滤 - 注意:HTTPS 页面引用 HTTP 资源时,浏览器默认不发送 Referer,所以务必保证你的资源站点也启用 HTTPS,避免协议降级导致误拦截
拒绝非法请求时采用强阻断+友好提示
返回 403 Forbidden 是最直接的阻断方式,但纯403不利于排查和用户体验。更稳妥的做法是返回一张轻量级防盗链提示图,同时设置正确 Content-Type:
- 准备一张小尺寸 PNG(如 1×1 像素透明图,或带文字的 200×100 提示图),放在 Nginx 可读路径,例如
/usr/share/nginx/html/hotlink-denied.png - 用
rewrite替换响应内容:rewrite ^(.*)$ /hotlink-denied.png break; - 确保该提示图自身不受防盗链限制——可在同一 location 内加内部判断,或单独为
/hotlink-denied.png配置一个无防盗链的 location - 补充响应头增强安全性:
add_header X-Content-Type-Options nosniff;防止MIME类型嗅探
补充防御:结合日志与主动监控
配置生效后,仅靠规则不够。需验证是否真起作用,并发现潜在绕过:
- 检查 Nginx 访问日志,筛选出状态码为 403 且
$http_referer不在白名单中的请求,确认拦截准确率 - 用
curl -e "https://evil-site.com" https://your-site.com/test.jpg主动测试盗链行为是否被拒 - 对 m3u8/HLS 流,注意播放器可能通过
Referer或Origin头发起请求;如需更高安全,应搭配 Token 验证(如secure_link模块),而非仅依赖 Referer - 定期审计白名单域名,及时剔除已下线或被黑的子站


















