使用php发送文件而不暴露目录

时间:2019-04-29 15:32:01

标签: php apache file http-headers

这些是我的设置:

Web Server: Apache/2.4.25
Web structure:
 /
 |__Video/
         |__ test.mp4
 |__play.php

当前,我将所有视频公开到服务器上,直接将视频目录放置在apache目录中。

我想要获得的是将视频移至Apache目录之外(假设没有权限问题),并通过GET请求仅将请求的视频传输到play.php,例如:GET play.php?req=test.mp4

当前,我编写了以下代码:

$name = $_GET['req']
header('Accept-Ranges: bytes');
header('Content-Length: ' . filesize($name));
header('Content-Type: ' . mime_content_type($name));
header('Content-Disposition: filename="'.$name.'"');
readfile($name);
exit;

缺少什么?尝试使用play.php访问文件时,为什么会显示“不支持视频媒体”?使用“ mysite.com/Video/test.mp4”,我可以直接访问媒体而不会出现问题。

我意识到,如果等待足够长的时间,浏览器将完全下载该文件并进行复制。我无法获得的是文件流。

1 个答案:

答案 0 :(得分:0)

我已经找到了问题和可能的解决方案。

  1. 问题出在文件读取中,它会在浏览器处理之前传输整个文件。
  2. 可能的解决方法是使用X-SendFile模块。

如果您使用像我这样的Debian足以:

  • 安装:sudo apt-get install libapache2-mod-xsendfile
  • 修改您的站点配置文件(默认路径:/ect/apache2/sites-available),在开头(或到所选的VirtualHost)添加以下行:
XSendFile on
XSendFilePath /full/path/to/directory1
XSendFilePath /full/path/to/directory2
  • 重新启动Web服务器:sudo systemctl reload apache2 && sudo systemctl restart apache2
  • 以这种方式更新php脚本:
$name = "/full/path/to/directory1/".$_GET['req']
header('Accept-Ranges: bytes');
header('Content-Length: ' . filesize($name));
header('Content-Type: ' . mime_content_type($name));
header('Content-Disposition: filename="'.$name.'"');
header('X-Sendfile: $name');

有关更多信息,建议您访问this page