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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 19:45:08