需采用服务端权限控制与前端播放器协同方案:一、Nginx secure_link模块实现HLS分片签名验证;二、PHP代理脚本动态校验token与时间戳;三、Video.js注入Header对接JWT/OAuth2;四、PHP动态生成AES-128密钥并短期缓存。

如果您正在搭建一个PHP网站并希望支持视频点播功能,同时要求实现分片加载与防盗链保护,则需在服务端控制视频资源访问权限,并通过前端播放器协同完成HLS或DASH协议的分片请求。以下是实现该目标的具体方法:
一、使用HLS协议配合Nginx模块实现分片与防盗链
该方法利用Nginx的secure_link模块对.m3u8和.ts文件URL进行时间戳+签名验证,确保每个分片链接仅在有效期内可访问,防止盗链和非法下载。
1、在Nginx配置中启用secure_link模块,添加如下配置段:
2、为视频目录设置location块,启用secure_link指令并指定密钥变量;
立即学习“PHP免费学习笔记(深入)”;
3、在PHP脚本中生成带时间戳与MD5签名的URL,例如:https://example.com/video/playlist.m3u8?st=abc123&exp=1735689600;
4、将生成的URL传入前端HLS播放器(如hls.js)作为source地址;
5、确保.ts分片路径同样受同一secure_link规则约束,且签名逻辑与.m3u8一致。
二、基于PHP后端代理实现动态Token校验播放
该方法不依赖Nginx模块,由PHP脚本统一接管所有视频分片请求,在响应前验证请求头中的token或URL参数,通过则读取并输出原始分片内容,否则返回403。
1、创建PHP路由脚本video.php,接收path、token、t(时间戳)等参数;
2、校验token是否由服务端密钥加密生成,且t未超过当前时间1800秒;
3、解析path参数对应真实文件路径,检查文件是否存在且为.ts或.mp4类型;
4、设置响应头Content-Type与Accept-Ranges,以流式方式读取并输出文件片段;
5、前端播放器调用该PHP接口作为分片地址,例如:/video.php?path=movie/chunk_001.ts&token=xyz&t=1735682400。
三、集成Video.js播放器并启用自定义HTTP Header鉴权
该方法通过Video.js插件机制,在每次分片请求时自动注入Authorization或X-Auth-Token请求头,后端PHP根据该Header判断合法性,适用于需要对接JWT或OAuth2体系的场景。
1、引入video.js及videojs-contrib-hls库;
2、初始化播放器时配置html5.hls.overrideNative为true;
3、监听beforeRequest事件,在回调中向options.headers添加X-Auth-Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...;
4、PHP后端在接收.ts或.m3u8请求时,从$_SERVER['HTTP_X_AUTH_TOKEN']提取并验证JWT有效性;
5、验证失败则输出401状态码,播放器将中断加载并触发error事件。
四、使用AES-128加密HLS流并在PHP中动态解密密钥
该方法对HLS的AES-128密钥文件(.key)实施动态生成与短期有效策略,每次页面加载生成唯一密钥,并通过PHP脚本返回加密后的密钥内容,使盗链者无法复用密钥解密分片。
1、在服务器上预置一个主密钥用于派生会话密钥;
2、用户请求播放页时,PHP生成随机16字节密钥与IV,保存至内存缓存(如Redis),设置过期时间为300秒;
3、将该密钥用主密钥加密后,以Base64形式嵌入.m3u8的#EXT-X-KEY标签中;
4、创建key.php脚本,接收sid参数,从缓存中取出对应密钥并直接输出原始二进制内容;
5、确保.key请求URL形如:/key.php?sid=7a8b9cde,且该URL本身受Referer与User-Agent双重校验。



















