Иногда на сайте возникает необходимость ограничить доступ к определенным файлам по разным причинам (раздача файлов только авторизованным пользователям, антилич и так далее).
Для решения этой проблемы можно использовать разные подходы:
- Распространяйте файлы с помощью php-скрипта (замените php на тот, который вам больше нравится).
При таком подходе мы передаем имя файла в качестве параметра скрипту.
Код проверяет все условия, при которых возможно получить доступ к данному файлу, и решает, выдавать ли 404 или запрошенный файл.
Этот подход подходит для небольших файлов, однако по мере увеличения размера загружаемого файла он будет потреблять много системных ресурсов, поскольку файл будет прочитан в память, а затем передан.
- Используйте некоторые неочевидные возможности веб-серверов.
Покопавшись в его документации, я обнаружил, что с помощью этого сервера можно контролировать распространение файлов, проверяя права доступа непосредственно перед раздачей контента.
Итак, давайте начнем.
За nginx у меня стоит Apache, который обрабатывает запросы на динамический контент, описал примерно так: location / {
proxy_pass 127.0.0.1/;
}
Сначала мы помещаем наш контент в специальные каталоги.
В моем случае сайт находится по адресу /вар/www , я разместил защищенный контент в /вар/www/защищено .
Для этого раздела я добавил в конфигурацию nginx следующие строки: location /protected {
root /var/www ; internal ;
}
Здесь корень указывает, где находится сайт. Директива внутренний указывает, что эта область будет доступна только в том случае, если nginx внутренне перенаправляет в каталог защищенный .
Таким образом, даже зная прямой адрес ресурса на сервере, мы получим в ответ на наш запрос 404. Первый этап пройден, контент недоступен по прямой ссылке.
Однако нам все равно необходимо показывать этот контент при определенных условиях.
Для этого приведем первую локацию к следующему виду: location / {
rewrite ^/download/(.
*) /download.phpЭpath=$1 last;
proxy_pass 127.0.0.1/;
}
Таким образом, все запросы, пытающиеся получить что-либо из загрузки, будут перенаправлены в файл download.php. Этот файл будет использоваться для принятия решения о том, разрешить или запретить пользователю доступ к файлу.
Исходный текст самого файла download.php может быть таким: Если пользователю разрешен доступ к этому файлу, то мы отправляем этот заголовок, иначе отправляем ему 404. После определения прав доступа работа php завершается.
Далее nginx получает этот заголовок, выполняет внутреннее перенаправление и начинает отдавать пользователю запрошенный файл.
Краткое содержание: Этот способ, как мне кажется, будет потреблять гораздо меньше системных ресурсов при передаче файлов, для которых необходимо проверять права.
Статья основана на следующем материале: blog.kovyrin.net/2006/11/01/nginx-x-accel-redirect-php-rails/lang/ru Используемые материалы: sysoev.ru/nginx/docs P.S. Данная статья не претендует на полноту и не может рассматриваться как инструкция по настройке сервера nginx. Он намеренно опускает моменты, касающиеся сжатия, кэширования и тому подобного.
Теги: #Nginx #php #content #private #access #разработка веб-сайтов
-
Системы Прогнозирования Будущего
19 Oct, 24 -
Менделеев Дмитрий Иванович.
19 Oct, 24 -
Отображение Комментариев В Случайном Порядке
19 Oct, 24