Nginx防盗链核心是分层防护:先用valid_referers白名单拦截粗暴盗链(支持none、blocked、域名匹配),再通过internal指令+X-Accel-Redirect由后端鉴权后零带宽转发敏感资源,兼顾安全与性能。

要让 Nginx 既保护静态资源(如图片、JS、CSS),又不让合法访问变卡或失效,关键不是“一刀封死”,而是分层控制:先拦住明显盗链,再用内部机制兜底敏感资源。单纯靠 Referer 防盗链只能防粗暴嵌入,真要控“谁能在什么时候下载什么”,得结合后端鉴权与 X-Accel-Redirect。
Referer 防盗链:快、轻、有局限
这是最常用的第一道防线,适合防止其他网站直接 <img src="your.com/a.jpg"> 引用你的资源。
-
配置核心:在对应 location 块中写
valid_referers白名单,再用if ($invalid_referer)拦截 -
典型写法:
location ~* \.(jpg|jpeg|png|gif|js|css)$ { valid_referers none blocked *.your-domain.com your-domain.com; if ($invalid_referer) { return 403; } alias /data/static/; } -
注意点:
-
none允许直接输入 URL 访问(比如用户收藏图片链接);blocked拦掉被代理/防火墙清空 Referer 的请求 - 白名单建议用域名(
your-domain.com),别写 IP,否则 HTTPS + CDN 场景下容易失效 - Referer 可被客户端伪造,所以它只防“懒人盗链”,不防恶意爬虫或登录用户分享直链
-
internal 指令:彻底禁止外部直达,只许内部跳转
当你有一批资源(比如用户私有头像、后台导出的报表 PDF)绝对不允许浏览器地址栏输入路径就打开,就得用 internal。
-
作用:Nginx 主动拒绝所有来自客户端的直接请求,只响应由
error_page、rewrite ... last或X-Accel-Redirect触发的内部重定向 -
配置示例:
location /private/ { internal; alias /data/private/; }此时访问
https://your.com/private/report.pdf会直接 404 或 403;但后端返回X-Accel-Redirect: /private/report.pdf,Nginx 就能静默读取并吐出文件
Wjs Uploading Video下载将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
-
配合后端使用才生效:Spring Boot、Django 等框架需在 Controller 中设置响应头
X-Accel-Redirect,不能靠前端跳转
X-Accel-Redirect:权限校验+零带宽转发
这是真正实现“按需放行”的方案——后端做完登录态、角色、时效等判断后,告诉 Nginx:“请把这文件发出去”,Nginx 负责高效传输,不经过应用层读取。
-
后端只需做两件事:
- 检查用户是否有权访问该资源(比如查 DB、校验 token)
- 设置响应头:
X-Accel-Redirect: /path/in/nginx/xxx.png(路径必须匹配 Nginx 中定义的 internal location)
-
Nginx 对应配置:
location /protected/ { internal; alias /data/protected/; }假设后端返回
X-Accel-Redirect: /protected/user/123/avatar.jpg,Nginx 就去读/data/protected/user/123/avatar.jpg并返回,整个过程不走 Java/Python 进程,不占应用内存和带宽 -
优势明显:
- 权限逻辑完全由后端掌控,支持动态规则(如“仅限 VIP 下载”“链接 1 小时后过期”)
- 大文件下载不压垮后端服务,Nginx 零拷贝发送
- URL 不暴露真实路径,也不需要签名参数,页面渲染不受影响
补充加固项:别漏掉这些细节
光防盗链不够,还得堵住其他常见漏洞:
-
禁用目录浏览:在静态资源 location 中加
autoindex off;,避免/images/返回一堆文件列表 -
限制 HTTP 方法:对静态资源只允许
GET和HEAD,加一句limit_except GET HEAD { deny all; } -
跨域谨慎放开:如果前端是独立域名,用
add_header Access-Control-Allow-Origin "https://fe.example.com";明确指定,别用*+credentials组合(会报错) -
缓存策略分离:公开资源(如 logo.js)可缓存 1 年;用户私有资源(如 /user/xxx/file.pdf)设
Cache-Control: no-store,避免被代理缓存

















