Контролируемое скачивание с HTTP сервера

программирование php сервер apache nginx

Как лучше всего реализовать контролируемое скачивание с HTTP сервера? Суть в том, чтобы при определенном запросе отдавался файл, физически находящийся вне директории www, и при этом проводился ряд проверок - например авторизирован ли пользователь, и велся учет количества скачиваний.
Доступные средства: nginx+apache (в ролях front/back), PHP, рут доступ.

Сейчас у меня это реализовано в виде PHP скрипта, получающего содержимое нужного файла, и выводящего его через echo с правильными заголовками. Но что-то мне подсказывает, что такой вариант не очень хорош, так как: 1) неизвестно как будет вести себя с большими файлами (в плане использования ресурсов озу), 2) по сути во время скачивания интерпретатор находится в подвешенном состоянии.

Кто может подсказать решение получше?
Ответы:
Рекомендую использовать nginx и его функцию контролируемого скачивания.
В nginx легко реализуется. URL должен вести на PHP-скрипт (это можно через url rewrite сделать), который и будет делать все необходимые проверки. Затем PHP-скрипт устанавливает заголовок X-Accel-Redirect в значение, соответствующее URL'у файла (при этом в конфиге nginx можно закрыть доступ к этому URL'у извне). Примерно так: header('X-Accel-Redirect: /some_hidden_directory/my_file.dat');
Засчет этого нет необходимости выполнять операции с файлом в PHP-скрипте и держать его в памяти в течение всего времени загрузки. Скрипт выполняет только проверки и запись данных в БД, а затем завершается. Отдача файла производится самим веб-сервером.


13 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.