X-SendFile на Apache2 (PHP), обслуживающий файл 0B, хотя ошибок нет

Я установил 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, как и некоторые другие, так что это как-то связано с этим?

Спасибо.


person Doug Wollison    schedule 20.08.2011    source источник
comment
Когда вы говорите, что не получаете ошибок, означает ли это, что вы пробовали tail -f /var/log/apache2/errors.log   -  person Gerry    schedule 20.08.2011
comment
Я прочитал его и не нашел ничего, относящегося к файлу, который он пытается загрузить. Нашел много записей об этом, пытаясь получить файл значка, который я еще не создал.   -  person Doug Wollison    schedule 20.08.2011
comment
Хех, да, я тоже получаю эту ошибку favicon   -  person Gerry    schedule 20.08.2011


Ответы (5)


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

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

# enable xsendfile
XSendFile On

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

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

person Pierre    schedule 25.05.2013
comment
Сначала я пытался добавить только XSendFile On, но мне пришлось также указать XSendFilePath, потому что мои правила перезаписи начали вести себя странно. Спасибо! - person taber; 09.07.2015

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

Например:

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

Я использую его в 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 работало хорошо.

person Dr Kabeza    schedule 27.07.2016

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

XSendFilePath C:/

person Svetoslav Marinov    schedule 26.08.2013

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

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

Ошибка X-Sendfile

person Gerry    schedule 20.08.2011
comment
Я прочитал предложения и попробовал некоторые из них (удаление заголовка типа, переключение на X-LIGHTTPD-send-file), но та же проблема. - person Doug Wollison; 20.08.2011
comment
Вы пытались переместить заголовок X-Sendfile в начало списка заголовков? - person Gerry; 20.08.2011
comment
Ага. Добавлял и удалял другие заголовки в разных комбинациях, без изменений. Ну, кроме того, что имя файла загружается, когда я избавился от заголовка Content-Disposition. - person Doug Wollison; 21.08.2011
comment
Хм, тогда я запутался, извините. - person Gerry; 21.08.2011
comment
Есть ли шанс, что X-Sendfile на самом деле не работает, но не выдает никаких ошибок? Я не уверен, как это проверить. - person Doug Wollison; 21.08.2011
comment
Если файл .load содержит определение LoadModule для x-sendfile и вы не получаете никаких ошибок в error.log при перезапуске apache, скорее всего, он загружен правильно. - person Gerry; 21.08.2011