Apache2(PHP)上的X-SendFile服务于0B文件,但没有错误

时间:2011-08-20 18:35:43

标签: php apache2 download x-sendfile

我安装了mod_xsendfile,它似乎已成功; xsendfile.load出现在/ etc / apache2 / mods-enabled中,我在运行测试脚本时没有发现任何错误。但是,每次运行它时,我都会得到一个0B文件。

这是我的测试脚本:

$file = 'sample.mp4';
$path = '/var/storage/media/'.$file;
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
header("Content-type: application/octet-stream");
header("X-Sendfile: $path");

显然我有一个存储在/var/storage/media/sample.mp4中的文件,它只有25MB,如果我这样做的话,它的服务非常好:

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($path));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($path));
ob_clean();
flush();
readfile($path);
exit;

我在/ var / storage和/ var / www的.htaccess文件中也有这个(所有这些文件都存储在/var/www/files/index.php中):

XSendFile on
XSendFileAllowAbove on

就像我说的那样,我没有错误,而且PHP可以访问该文件,但我必须丢失一些x-sendfile配置...这让我想起,我注意到mods-enabled几乎每个mod有一个.load和.conf,但xsendfile只有.load,但是其他一些,所以它与它有什么关系吗?

感谢。

5 个答案:

答案 0 :(得分:6)

我遇到了同样的问题,这个解决方案对我有用:

安装模块后,您需要启用它并为Apache配置提供访问路径(httpd.conf用于全局配置,或特定站点vhost用于特定配置),如下所示:

# enable xsendfile
XSendFile On

# enable sending files from parent dirs
XSendFilePath /var/www/

当然你必须用你想让xsendfile访问的文件夹替换'/ var / www /'

答案 1 :(得分:3)

如果使用Apache,请确保在Apache配置中也打开XSendFile。如果你不这样做,它看起来会有效,但是会提供空文件。

例如:

<Directory /var/www/>
    Options Indexes FollowSymLinks MultiViews
    XSendFile on
    AllowOverride All
    Order allow,deny
    allow from all
</Directory>

答案 2 :(得分:2)

我在Ubuntu 14.04和Apache / 2.4.7上使用它。 重要的是:

  1. 在每个主机配置上设置:
  2. <Directory /var/www/path/to/files>
        XSendFile On
        XSendFilePath /var/www/path/to/files
    </Directory>
    
    1. 添加到.htaccess:
    2. XSendFile on
      

      虽然我只使用1;它让我下载空文件。 添加2后,工作得很好。

答案 3 :(得分:1)

在Windows上我必须使用以下内容才能提供doc roo之外的文件。 其他一切都给了我404

XSendFilePath C:/

答案 4 :(得分:0)

尝试在文件中进行标题(“X-Sendfile:$ path”); 第一次标题()调用。

另外看看这个。看起来像一个类似的问题,它可能会给你一些想法:

X-Sendfile Error