Ошибка X-Sendfile - PullRequest
       34

Ошибка X-Sendfile

0 голосов
/ 30 августа 2010

Я пытаюсь отправить файлы с помощью директивы X-Sendfile в lighttpd.

Мой php код:

header("Content-Type: application/force-download");
header( "Content-Disposition: attachment; filename=" . 's.php');
header("Content-Length: ". filesize("/home/web/domain/htdocs/download.php"));
header( "X-Sendfile: /home/web/domain/htdocs/download.php");

(я отправляю файл download.php только для тестирования)

Однако я получаю пустой файл независимо от того, что я пытаюсь. Если я изменю имя файла, я получу;

30.08.2010 18:01:14: (mod_fastcgi.c.2587) ошибка файла отправки: не удалось получить запись stat_cache для: /home/web/domain/htdocs/downloa1d.php

Итак, он работает, но когда я отправляю правильный файл, он не выдает никакой ошибки в журналах, и браузер загружает пустой файл.

Что может быть не так? Что мне делать?

Ответы [ 2 ]

1 голос
/ 13 декабря 2014

хорошо, это старый пост, но я все равно отвечу, потому что я слишком долго застрял на нем, и я нигде не нашел своего решения, так что я иду:

Да, я отредактировал lighttpd.conf и добавил

fastcgi.server += ( ".php" => (( "allow-x-send-file" => "enable" )) )

и использовал

Header("X-LIGHTTPD-send-file: /path/filename");

на тестовой странице php.Но это не сработало.Мне потребовалось некоторое время, чтобы понять, что у меня также есть определение php в

etc/lighttpd/conf-enabled/15-fastcgi-php.conf

После того, как я добавил опцию, это сработало:)

1 голос
/ 01 апреля 2013

Скорее всего, у вас нет правильной строки в файле lighttpd.conf. Добавьте это в ваш fastcgi.server между опциями со стрелками =>:

"allow-x-send-file" => "enable",

Все, кроме последнего варианта, заканчиваются запятыми. Я предполагаю, что у вас уже настроены ваши fastcgi. Если вы используете другую среду для подключения PHP к вашему серверу, я не могу вам помочь. Если у вас более одного рабочего процесса PHP, вы должны добавить эту опцию ко всем из них.

Я должен добавить, что файлы .php имеют небольшой размер, и вывод их с помощью readfile () не приведет к появлению проблем. И, как я понимаю, вы неправильно используете некритические заголовки. Нет такой вещи, как принудительная загрузка, она будет вести себя как неизвестный тип файла. Используйте application/octet-stream. И ваш Контент-Диспозиция тоже шаткая. Не только в этой странной струне. Что клиент должен получить это: Content-Disposition: attachment; filename="My file ♥.txt" Имя файла заключено в двойные кавычки, и оно НЕ экранировано; вместо этого он находится либо в UTF-8, либо в кодировке вызывающей страницы (это грязная серая область, где каждый браузер работает по-своему) Вам даже не нужно включать имя файла, чтобы быть в безопасности, если вас устраивает путь загрузки. Тогда это будет выглядеть так: Content-Disposition: attachment Затем вы можете использовать трюк с псевдо-каталогом, чтобы указать менее ошибочное имя файла: www.example.com/download.php/Custom%20Name.txt Это будет работать более надежно, чем параметр filename =, но требует больше планирования в системе ссылок. Это может потребовать от вас перенаправления.

...