类似Udemy的视频教程平台:如何阻止未订阅用户直接URL访问视频?
解决视频直链无权限访问的方案
核心问题分析
你的视频文件直接暴露在公开静态路径下,Web服务器(比如Nginx、Apache)会直接处理这类请求,完全绕过了后端的权限校验中间件,导致未订阅用户能直接通过URL访问视频。
可行解决方法
方法一:后端代理视频请求(通用落地方案)
- 迁移视频存储位置:把视频文件从
storage/uploads这类公开静态目录,移到Web服务器无法直接访问的私有目录(比如后端项目根目录下的private_videos文件夹)。 - 编写权限校验接口:创建一个接口(比如
/course/video/play/{video_id}),流程如下:- 先校验当前登录用户是否已订阅该视频所属课程
- 校验通过后,以流的形式读取对应视频文件,返回给前端,同时设置响应头:
Content-Type: video/mp4、Content-Disposition: inline
- 前端调整播放源:前端不再直接使用视频物理路径,而是调用上述接口作为视频播放地址。
方法二:签名URL授权(适合云存储场景)
如果视频存在云存储(如OSS、COS):
- 关闭存储桶公开访问:确保视频文件默认无法直接通过URL访问
- 后端生成临时签名:用户请求播放时,后端先做权限校验,通过后生成带过期时间的签名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
相关产品推荐
相关产品推荐

