XSendfile не работает - PHP, Apache, Cpanel - PullRequest
1 голос
/ 03 января 2012

Я настоятельно рекомендовал использовать XSendfile, так как мы обслуживаем довольно большие файлы с нашего сервера.На сервере работает Cpanel.Ранее мы использовали прямой скрипт принудительной загрузки, который также не работал в некоторых браузерах.В надежде убить двух зайцев одним выстрелом с помощью XSendfile.

ОК, значит, наш хост включил Xsendfile на нашем сервере.Я написал скрипт быстрого теста:

$file = "/home/deli/central/testfile.doc";
header("X-Sendfile: $file");
header("Content-type: application/octet-stream");
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
exit;

Когда я запускаю это, я получаю приглашение на загрузку.Но отправляемый файл всегда имеет размер 0 КБ.

Немного исследований. Кажется, вам нужно настроить различные параметры в файле конфигурации apache или в файле htaccess.Мне также сказали, что не стоит добавлять его в конфигурацию apache, иначе оно может быть перезаписано при обновлении.Я бы предпочел сделать это в htaccess, поскольку у меня нет прямого доступа к конфигурации apache, и я предпочел бы иметь контроль, который должен предлагаться с помощью htaccess.

ЕСЛИ я могу заставить его работать,конечно.

Итак, я добавил в файл htaccess следующее:

XSendFile в XSendFilePath / home / deli / central XSendFileAllowAbove On

(Относительный путь отсценарий для центрального каталога файлов: ../../deli/central)

Если я добавлю эти строки в htaccess и поместу его в каталог public_html (тот же каталог, что и сценарий тестирования), когдаЗатем я запускаю тестовый скрипт и получаю ошибку 500.Быстрый просмотр журналов ошибок показывает:

/ home / north / public_html / .htaccess: XSendFilePath здесь не разрешен

Может ли кто-нибудь объяснить мне, что я могу делать неправильно?

ps - я только что прочитал, что гораздо эффективнее это сделать в конфигурации apache, поэтому серверу не нужно сканировать и загружать все файлы htaccess.Не знаю, правда ли это или нет.

Помощь очень ценится, это что-то вроде showtopper в проекте:)

ps Я забыл упомянуть - если я поставлюпри прямой принудительной загрузке в сценарий, используя тот же путь к файлу $, файл загружается просто отлично.Так что путь кажется правильным.

Ответы [ 2 ]

3 голосов
/ 08 мая 2014

Надеюсь, это кому-нибудь поможет ...

У меня была такая проблема: всегда и везде -> 0 байт

Я решаю это перемещение

XSendFile On
XSendFilePath /var/1000italy/data/offline

из раздела virtualHost

<VirtualHost *:80>

    DocumentRoot "/var/{{ app_name }}/web"
    ServerName {{ app_name }}.dev

    # here was the problem
    XSendFile On
    XSendFilePath /var/1000italy/data/offline

    <Directory "/var/{{ app_name }}/web">
        allow from all
        Options -Indexes
        AllowOverride All
    </Directory>

    ErrorLog /var/log/apache2/{{ app_name }}_error.log
    CustomLog /var/log/apache2/{{ app_name }}_access.log combined

</VirtualHost>

в раздел каталога

<VirtualHost *:80>

    DocumentRoot "/var/{{ app_name }}/web"
    ServerName {{ app_name }}.dev

    <Directory "/var/{{ app_name }}/web">
        allow from all
        Options -Indexes
        AllowOverride All

        # HERE EVERYTHING WORKS FINE
        XSendFile On
        XSendFilePath /var/1000italy/data/offline
    </Directory>

    ErrorLog /var/log/apache2/{{ app_name }}_error.log
    CustomLog /var/log/apache2/{{ app_name }}_access.log combined

</VirtualHost>

Ciao

1 голос
/ 05 января 2012

Если вы получаете 0 байтов, это может означать, что необходимость сжатия вывода отключена, см. здесь, чтобы узнать больше . Для XSendFilePath здесь не допускается ошибка, которая является синтаксической проблемой с вашим .htaccess. Проверьте это вручную, если вы можете убедиться, что оно находится в нужном месте согласно документации .

...