You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

类似Udemy的视频教程平台:如何阻止未订阅用户直接URL访问视频?

解决视频直链无权限访问的方案

核心问题分析

你的视频文件直接暴露在公开静态路径下,Web服务器(比如Nginx、Apache)会直接处理这类请求,完全绕过了后端的权限校验中间件,导致未订阅用户能直接通过URL访问视频。

可行解决方法

方法一:后端代理视频请求(通用落地方案)

  1. 迁移视频存储位置:把视频文件从storage/uploads这类公开静态目录,移到Web服务器无法直接访问的私有目录(比如后端项目根目录下的private_videos文件夹)。
  2. 编写权限校验接口:创建一个接口(比如/course/video/play/{video_id}),流程如下:
    • 先校验当前登录用户是否已订阅该视频所属课程
    • 校验通过后,以流的形式读取对应视频文件,返回给前端,同时设置响应头:Content-Type: video/mp4、Content-Disposition: inline
  3. 前端调整播放源:前端不再直接使用视频物理路径,而是调用上述接口作为视频播放地址。

方法二:签名URL授权(适合云存储场景)

如果视频存在云存储(如OSS、COS):

  1. 关闭存储桶公开访问:确保视频文件默认无法直接通过URL访问
  2. 后端生成临时签名:用户请求播放时,后端先做权限校验,通过后生成带过期时间的签名URL返回给前端,前端用这个URL播放,过期后自动失效。

方法三:修复中间件不生效问题

如果坚持用中间件拦截,先排查两个关键点:

  • 检查Web服务器配置:比如Nginx是否直接处理了/storage/uploads/course_videos的请求,没转发给后端。修改配置让这类请求走后端:
    location /storage/uploads/course_videos {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
    
  • 确认中间件拦截范围:确保中间件的路由规则覆盖了视频文件的URL路径,权限校验不通过时直接返回403状态码。

额外安全补充

  • 给视频响应头添加X-Frame-Options: SAMEORIGIN,防止被其他网站嵌入播放
  • 检查请求的Referer头,只允许来自自己平台的域名请求视频

内容的提问来源于stack exchange,提问作者spooor802

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 20:07:54