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

fjnneemd  于 2023-01-24  发布在  PHP
关注(0)|答案(5)|浏览(100)

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

$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中,它只有25 MB,如果我这样做,它会非常好地服务:

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,但也有一些其他人,所以这有什么关系吗?
谢谢。

bakd9h0s

bakd9h0s1#

我遇到了同样的问题,这个解决方案对我很有效:
安装模块后,您需要启用它并给予Apache配置的访问路径(全局配置为httpd.conf,特定配置为特定站点vhosts),如下所示:

# enable xsendfile
XSendFile On

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

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

fdbelqdn

fdbelqdn2#

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

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

baubqpgj3#

我在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后,工作得很好。

mwkjh3gx

mwkjh3gx4#

在Windows上,我必须使用以下命令才能在docroo之外提供文件,其他所有命令都是404
XSendFilePath C:/

mnemlml8

mnemlml85#

尝试将**header("X-Sendfile: $path");作为文件中的第一个header()**调用。
再看看这个。看起来像是一个类似的问题,它可能会给予你一些想法:
X-Sendfile Error

相关问题