Nginx 的 valid_referers 仅能有效拦截第三方网页嵌入视频,对投屏、下载工具、抓包等场景无效,因其 Referer 常为空或可伪造;真正防直链需后端签发带时效与签名的临时链接。

单纯靠 Nginx 的 valid_referers 无法防投屏,也不能真正阻止“HTML 视频被复制直链”。它只对 Referer 可控的普通网页引用有效,而投屏、下载工具、抓包、WebView 内嵌等场景下 Referer 常为空或不可信。
为什么 valid_referers 对投屏基本无效
投屏(如 Chrome Cast、iOS AirPlay、安卓无线投屏)本质是本地浏览器或系统媒体服务直接请求视频 URL,不经过原网页的 DOM 渲染流程。此时:
- Referer 字段通常为空(
none),若你配置了valid_referers none,请求直接放行 - 即使没配
none,部分投屏实现会伪造 Referer 为https://yourdomain.com/或其他合法值,Nginx 无法分辨真假 - 手机系统相册、文件管理器、第三方播放器打开视频链接时,同样无 Referer 或任意 Referer
怎样让 Nginx 防盗链至少“管住网页嵌入”
这是唯一 Nginx 能稳定起效的边界:拦截第三方网站在 <video></video> 标签中直接引用你的 MP4 地址。关键在 location 匹配 + 严格 valid_referers:
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
- 把视频资源统一放在独立路径,比如
/videos/,避免和 HTML 混在一起 - 用正则匹配后缀,且排除
.html和根路径:location ~ ^/videos/.*\.(mp4|mov|webm)$ -
valid_referers必须显式列出所有合法来源,包括协议和子域名:valid_referers none https://yourdomain.com https://www.yourdomain.com https://app.yourdomain.com - 不要写
*.yourdomain.com—— 它不匹配 HTTPS,且 Nginx 的通配符对协议无效;改用多个明确条目 - 务必加
if ($invalid_referer) { return 403; },不能只靠valid_referers声明
真正防投屏/直链,必须绕过前端暴露 URL
只要 <video src="https://yoursite.com/videos/abc.mp4"></video> 出现在 HTML 里,任何人打开 DevTools 就能复制链接。Nginx 在这里已无能为力。可行路径只有两条:
立即学习“前端免费学习笔记(深入)”;
- 前端不写死视频地址,而是调用后端 API 获取临时播放链接(如
/api/play?vid=123),后端生成带签名和过期时间的代理 URL,例如/proxy/v1/abc.mp4?t=1734655200&s=8a3f9c... - Nginx 拦截
/proxy/路径,校验t(时间戳)、s(HMAC 签名)、u(用户 ID),全部通过才反向代理到真实存储(S3 / OSS / 本地文件) - 签名逻辑必须包含不可预测因子(如用户 session ID 或 JWT payload),否则攻击者可批量伪造
容易被忽略的兼容性雷区
即使做了上述配置,以下情况仍会导致误拦截或失效:
- 微信内置浏览器、QQ 浏览器、某些安卓 WebView 加载页面时,Referer 可能被清空或截断,需在
valid_referers中保留none并配合用户行为日志观察 - 如果你用 PWA 或 Service Worker 缓存视频,首次加载可能带 Referer,后续复用缓存则无 Referer,导致 403;应避免缓存受防盗链保护的资源
- 移动端 Safari 对
Referrer-Policy: strict-origin-when-cross-origin执行较严,跨域 iframe 中的 video 请求 Referer 可能只剩 origin,需在valid_referers中补全https://yourdomain.com而非仅yourdomain.com


















