如何通过XAMPP中Apache服务器内的PHP文件播放服务器外硬盘存储的视频
问题原因
原来的代码无法运行有两个核心原因:
- 你输出的
file://E:/Vtest/Fle.mp4是本地文件协议,浏览器访问Apache提供的http页面时,会尝试读取访问网站的用户自己设备的E盘文件,不是你服务器上的E盘文件 - 浏览器安全策略默认禁止http协议的网页加载本地file协议的资源,就算是你本地测试自己访问自己的服务,也会被拦截
方案1:配置Apache别名(推荐,性能最优)
不需要PHP做额外处理,直接让Apache代理外部目录的文件请求,适合绝大多数场景
操作步骤:
- 打开XAMPP控制面板,点击Apache行的
Config按钮,选择httpd.conf打开配置文件 - 在配置文件末尾添加以下内容:
# 把/vtest路径映射到E盘的Vtest目录 Alias /vtest "E:/Vtest/" <Directory "E:/Vtest/"> Options Indexes FollowSymLinks MultiViews AllowOverride All Require all granted </Directory>
- 保存配置文件,重启Apache服务
- 修改你的播放页面代码即可:
<?php $src = "/vtest/Fle.mp4"; ?> <video src="<?php echo $src;?>" autoplay controls style="width:50%;height:50%;"></video>
方案2:PHP代理输出文件(适合需要做权限控制的场景)
如果不想修改Apache配置,或者需要给视频访问加登录校验等逻辑,可以用PHP读取外部文件再输出给前端
- 新建
video_proxy.php文件,放在Apache网站根目录下,代码如下:
<?php // 配置允许访问的目录白名单,防止路径遍历漏洞 $allowed_dir = 'E:/Vtest/'; $request_file = $_GET['filename'] ?? ''; // 校验文件路径合法性 $real_path = realpath($allowed_dir . $request_file); if (!$real_path || strpos($real_path, $allowed_dir) !== 0 || !is_file($real_path)) { http_response_code(404); exit('文件不存在'); } // 输出正确的响应头 $mime = mime_content_type($real_path); header('Content-Type: ' . $mime); header('Content-Length: ' . filesize($real_path)); // 输出文件内容 readfile($real_path); exit; ?>
- 修改你的播放页面代码:
<?php $src = "video_proxy.php?filename=Fle.mp4"; ?> <video src="<?php echo $src;?>" autoplay controls style="width:50%;height:50%;"></video>
注意:如果是大于1G的大视频,建议优化proxy代码支持断点续传,否则进度条拖动会失效。
内容的提问来源于stack exchange,提问作者Eng.Ismail
相关产品推荐
相关产品推荐

