Nginx防盗链需用valid_referers识别合法来源,配合if($invalid_referer)和rewrite内部重写至本地警告图,再通过alias指定路径并设置缓存,禁止return 302外跳以防暴露真实路径。

在 Nginx 中实现防盗链,并在盗链请求时重定向到一张默认警告图片,核心是利用 valid_referers 指令识别合法来源,再结合 if 和 rewrite(或 return)完成跳转。注意:不能直接用 return 302 返回图片 URL,而应使用 rewrite 内部重写或 alias + try_files 方式返回本地图片,避免外部跳转暴露原始图路径。
1. 准备警告图片并确保可访问
把警告图片(如 /var/www/static/warning.png)放到 Nginx 能读取的目录下,并确认 Web 用户(如 www-data 或 nginx)有读取权限。该路径后续会在配置中用作内部响应资源。
2. 配置 valid_referers 限制 Referer
在对应 server 或 location 块中定义合法来源,例如只允许本站和指定域名访问图片:
valid_referers none blocked server_names *.example.com example.com;-
none允许无 Referer 请求(如直接输入 URL 访问) -
blocked允许 Referer 被防火墙/代理 stripped 的情况 -
server_names列出允许的域名(支持通配符)
3. 使用 if 判断并内部重写到警告图
当 Referer 不合法时,用 if ($invalid_referer) 触发重写。推荐用 rewrite ... last 实现内部 URI 重定向,避免 302 跳转(防止暴露真实图片路径):
- 在
location ~ \.(jpg|jpeg|png|gif)$块内添加: if ($invalid_referer) { rewrite ^/.*$ /warning.png last; }- 再单独配置
location = /warning.png,用alias指向实际文件路径:
location = /warning.png {
alias /var/www/static/warning.png;
expires 1h;
add_header Cache-Control "public";
}
4. 补充建议与注意事项
避免在 if 中使用 return 直接返回图片 URL(会导致 302 外部跳转,可能被绕过);不要在 root 下直接放 warning.png 并用 return 200,因为无法控制 MIME 类型和缓存头;建议对警告图启用缓存;若站点启用了 HTTPS,确保 warning.png 可通过 HTTP/HTTPS 一致访问;测试时可用 curl 模拟盗链:curl -H "Referer: https://evil.com" https://yoursite.com/photo.jpg。


















