X-SendFile на Apache2 (PHP), обслуживающий файл 0B, однако ошибок нет - PullRequest
5 голосов
/ 20 августа 2011

Я установил 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, это только 25 МБ, и он отлично обслуживается, если я делаю это следующим образом:

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;

У меня также есть это в файле .htaccess в / var / storage и / var / www (файлы, которые имеют все это, хранятся в /var/www/files/index.php):

XSendFile on
XSendFileAllowAbove on

Как я уже сказал, я не получаю ошибок, и PHP может получить доступ к файлу, но я долженчто-то не хватает в конфигурации x-sendfile ... это напоминает мне, я заметил, что в модах с включенным режимом почти каждый мод имеет .load и .conf, но xsendfile имеет только .load, но так же, как и некоторые другие, так чточто с этим связано?

Спасибо.

Ответы [ 5 ]

6 голосов
/ 25 мая 2013

У меня была такая же проблема, и у меня сработало это решение:

После установки модуля его необходимо включить и указать путь доступа к конфигурации Apache (httpd.conf для глобальной конфигурации или конкретные сайты для конкретной конфигурации), например:

# enable xsendfile
XSendFile On

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

Конечно, вы должны заменить '/ var / www /' на любую папку, к которой у xsendfile будет доступ

3 голосов
/ 12 декабря 2011

Убедитесь, что вы также включаете XSendFile в своей конфигурации Apache, если используете Apache. Если вы этого не сделаете, это будет выглядеть так, как будто это работает, но пустые файлы будут обслуживаться.

Например:

<Directory /var/www/>
    Options Indexes FollowSymLinks MultiViews
    XSendFile on
    AllowOverride All
    Order allow,deny
    allow from all
</Directory>
2 голосов
/ 27 июля 2016

Я использую его в Ubuntu 14.04 и Apache / 2.4.7.Важно:

  1. Настройка на каждой конфигурации хоста:
<Directory /var/www/path/to/files>
    XSendFile On
    XSendFilePath /var/www/path/to/files
</Directory>
Добавить в .htaccess:
XSendFile on

Пока я использовал только 1;это заставляло меня загружать пустые файлы.После добавления 2 работал хорошо.

1 голос
/ 27 августа 2013

В Windows мне пришлось использовать следующее, чтобы иметь возможность обслуживать файлы вне doc roo.Все остальное давало мне 404

XSendFilePath C:/

0 голосов
/ 20 августа 2011

Попробуйте сделать заголовок ("X-Sendfile: $ path"); первый header () вызов в файле.

Также взгляните наэтот.Похоже, похожая проблема, и это может дать вам несколько идей:

Ошибка X-Sendfile

...