php无法真正加密视频,只能通过权限校验(如登录、过期、ip限制)、web根目录外存储、php中转输出(readfile/fpassthru)、.htaccess/nginx禁止直接访问、支持range请求实现拖拽、token签名+短时效url等组合手段增强防盗。

PHP本身不能直接对视频文件进行“加密”以阻止下载,因为只要浏览器能播放视频,就说明数据已传到客户端,用户总有办法保存。真正可行的是控制访问权限 + 阻止直接链接(防盗链)+ 动态分片传输,让未授权用户无法轻易获取完整视频文件。
用PHP做访问权限校验(关键第一步)
把视频文件放在Web根目录之外(如/var/www/private/videos/),不对外暴露真实路径。所有视频请求都走PHP脚本中转:
- 用户请求类似
/play.php?id=123 - PHP检查登录状态、权限、过期时间、IP限制等
- 校验通过后,用
readfile()或fpassthru()输出文件内容,并设置正确Content-Type(如video/mp4) - 同时可设
Content-Disposition: inline确保浏览器内嵌播放而非下载
禁用直接URL访问(.htaccess 或 Nginx 配置)
防止用户猜到路径后绕过PHP直接访问:
- Apache下,在视频存放目录加
.htaccess:Deny from all - Nginx下,在对应location中加:
deny all; - 确保该目录不被Web服务器直接映射为可访问URL
启用HTTP范围请求(支持拖拽 & 兼容HLS/DASH)
很多播放器(尤其是HTML5)依赖 Range 请求实现拖动和缓冲。若PHP中转时忽略这点,会导致无法拖拽、卡顿甚至播放失败:
- 需解析
HTTP_RANGE请求头 - 手动设置
Status: 206 Partial Content和Content-Range头 - 只读取并输出对应字节段,而非整个文件
- 可使用现成轻量类(如 php-range-stream)简化实现
进阶:动态Token签名 + 短时效URL
进一步提升安全性,避免链接被分享滥用:
- 生成带签名和过期时间的URL,例如:
/play.php?id=123&token=abc123&exp=1718945200 - PHP端验证 token 是否由服务端用密钥生成、是否过期、ID是否匹配
- 配合前端JS播放器(如 Video.js)动态加载该URL,不暴露原始路径
- 可结合Redis临时存token,实现一键失效
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











