PHP读取后缀为.MUS的MP4视频文件无法正常播放如何解决
你遇到的问题本质是现有PHP代码缺失视频播放必需的HTTP响应头,且未处理浏览器的分段范围请求,自定义后缀触发了浏览器更严格的资源校验规则,导致视频无法被识别播放。
第一步:修复安全漏洞(必做)
你当前的代码存在高危路径遍历漏洞,攻击者可通过构造open_file.php?file=../../etc/passwd这类请求读取服务器任意敏感文件,必须先做权限校验,限制读取范围。
第二步:补全响应头+处理范围请求
替换你的open_file.php代码为以下内容即可正常播放:
<?php // 安全校验:剥离路径只保留文件名,禁止跳转上级目录 $file = basename($_GET['file']); $filePath = "/home/" . $file; // 校验文件合法性 if (!file_exists($filePath) || pathinfo($filePath, PATHINFO_EXTENSION) != 'mus') { http_response_code(404); exit; } // 基础响应头 header("Content-Type: video/mp4"); header("Accept-Ranges: bytes"); $fileSize = filesize($filePath); header("Content-Length: " . $fileSize); // 处理浏览器分段加载的范围请求(视频播放必需逻辑) if (isset($_SERVER['HTTP_RANGE'])) { list($rangeUnit, $rangeInfo) = explode('=', $_SERVER['HTTP_RANGE'], 2); if ($rangeUnit == 'bytes') { list($rangeStart, $rangeEnd) = explode('-', $rangeInfo, 2); $rangeStart = intval($rangeStart); $rangeEnd = ($rangeEnd == '') ? $fileSize - 1 : intval($rangeEnd); $length = $rangeEnd - $rangeStart + 1; header("HTTP/1.1 206 Partial Content"); header("Content-Range: bytes $rangeStart-$rangeEnd/$fileSize"); header("Content-Length: " . $length); // 输出指定区间的文件内容 $fp = fopen($filePath, 'rb'); fseek($fp, $rangeStart); echo fread($fp, $length); fclose($fp); exit; } } // 非分段请求直接输出完整文件 readfile($filePath); exit; ?>
额外排查点
如果修改后仍无法播放,可按以下顺序排查:
- 确认PHP进程对
/home/目录下的.mus文件有读取权限 - 检查PHP是否开启了错误输出,若有警告、提示类内容输出到响应体,会破坏视频二进制结构
- 清理浏览器缓存后再测试,避免旧的错误响应被缓存影响验证结果
内容的提问来源于stack exchange,提问作者Jose Manuel Abarca Rodríguez
相关产品推荐
相关产品推荐

