Контроль доступа к файлам, доступным для загрузки

У меня есть папка, которая содержит загруженные документы, которые может использовать мое приложение ZF для входа в систему. Я хочу, чтобы они могли использовать ссылку, такую ​​как http://server/documents/filename.pdf и загрузить файл, но я хочу иметь контроллер DocumentsController который позволяет существующим куки-файлам пользователей проверять, что они вошли в систему, и разрешение на загрузку файла. Я не хочу использовать URL-адреса, такие как http://server/documents/index/id/1 если мне это не нужно, хотя это не ужасный вариант.

Вы можете использовать X-SendFile для получения наилучшей производительности. Он поддерживается Apache (mod_xsendfile), Lighttpd и Nginx. Запрос сначала обрабатывается процессом php, который помещает специальный заголовок (X-Sendfile или X-Accel-Redirect для Nginx), а когда сценарий заканчивается, веб-сервер берет на себя и отправляет файл как статический файл. Это быстрее и использует меньше памяти.

Чтобы перенаправить весь запрос на ваш контроллер, вам нужно написать собственный маршрут в своем бутстрапе:

 protected function _initRouter() { $router = Zend_Controller_Front::getInstance()->getRouter(); $documentRoute = new Zend_Controller_Router_Route( 'document/:filename', array( 'action' => 'xsendfile', 'controller' => 'documents' ), array( 'filename' => '\..+$' ) ); $router->addRoute('document', $documentRoute ); return $router; } 

Вы можете использовать этот помощник действий для обработки заголовка x-sendfile: http://www.zfsnippets.com/snippets/view/id/27, и вам нужно иметь код для проверки подлинности пользователя.

Вам нужно будет использовать Zend_Acl для управления доступом к DocumentsController а затем создать собственный маршрут для перенаправления http://server/documents/* на http://server/documents/index/id/* .

Редактировать:

Решение, предложенное Tomáš, будет работать лучше для больших файлов.