5

我安装了 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,但其他一些也有,所以这和它有什么关系吗?

谢谢。

4

5 回答 5

8

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

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

# enable xsendfile
XSendFile On

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

当然,您必须将“/var/www/”替换为您希望 xsendfile 可以访问的任何文件夹

于 2013-05-25T06:28:22.430 回答
3

如果使用 Apache,请确保在 Apache 配置中也打开 XSendFile。如果您不这样做,它看起来会正常工作,但会提供空文件。

例如:

<Directory /var/www/>
    Options Indexes FollowSymLinks MultiViews
    XSendFile on
    AllowOverride All
    Order allow,deny
    allow from all
</Directory>
于 2011-12-12T16:22:48.293 回答
2

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

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

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

于 2016-07-27T16:56:30.510 回答
1

On Windows I had to use the following in order be able to serve files outside of doc roo. Everything else was giving me 404

XSendFilePath C:/

于 2013-08-26T23:16:28.317 回答
0

尝试制作header("X-Sendfile: $path"); 文件中的第一个header()调用。

也看看这个。似乎是一个类似的问题,它可能会给你一些想法:

X-Sendfile 错误

于 2011-08-20T19:26:12.367 回答