Я пытаюсь отправить файлы с помощью директивы 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 только для целей тестирования)
Тем не менее, я получаю пустой файл независимо от того, что я пытаюсь. Если я изменю имя файла, я получу;
2010-08-30 18:01:14: (mod_fastcgi.c.2587) ошибка отправки файла: не удалось получить запись stat_cache для: /home/web/domain/htdocs/downloa1d.php
Таким образом, он работает, но когда я отправляю правильный файл, он не дает ошибок в журналах, и браузер загружает пустой файл.
Что может быть неправильным? Что мне делать?
Вероятно, у вас нет нужной строки в файле lighttpd.conf. Добавьте это в свой файл fastcgi.server между параметрами с помощью => стрелки:
"allow-x-send-file" => "enable",
Все, кроме последнего варианта, заканчиваются запятыми. Я предполагаю, что у вас уже настроен ваш fastcgi. Если вы используете другую инфраструктуру для подключения PHP к вашему серверу, я не могу вам помочь. Если у вас более одного рабочего процесса PHP, вы должны добавить этот параметр ко всем из них.
Я должен добавить, что .php-файлы небольшие по размеру, и вывод их с помощью readfile () не приведет к вмятине. И, как я вижу, вы неправильно используете некоторые некритические заголовки. Нет такой вещи, как force-download, она будет вести себя как неизвестный тип файла. Используйте application/octet-stream
. И ваш Content-Disposition также шаткий. Не только в этой странной строке. Клиент должен получить: Content-Disposition: attachment; filename="My file ♥.txt"
Content-Disposition: attachment; filename="My file ♥.txt"
Имя файла окружено двойными кавычками, и оно не экранировано; вместо этого это либо в UTF-8, либо в кодировке вызывающей страницы (это грязная серая область, где каждый браузер действует по-разному). Вам даже не нужно включать имя файла в безопасное место, если вас устраивает путь загрузки. Затем это будет выглядеть так: Content-Disposition: attachment
Затем вы можете использовать трюк псевдокаталога, чтобы предоставить менее ошибочное имя файла: http://www.example.com/download.php/Custom%20Name.txt. Это будет работать более надежно чем этот параметр filename =, но требует больше планирования в системе ссылок. Это может потребовать от вас перенаправления.
хорошо, это старый пост, но я все равно собираюсь ответить, потому что я слишком долго задерживался на этом слишком долго, и я не нашел своего решения нигде, поэтому я иду:
Да, я отредактировал 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
После того, как я добавил вариант там, он работал 🙂