Использование Nginx И Php Для Проверки Разрешений Перед Обслуживанием Файлов

Иногда на сайте возникает необходимость ограничить доступ к определенным файлам по разным причинам (раздача файлов только авторизованным пользователям, антилич и так далее).

Для решения этой проблемы можно использовать разные подходы:

  1. Распространяйте файлы с помощью php-скрипта (замените php на тот, который вам больше нравится).

    При таком подходе мы передаем имя файла в качестве параметра скрипту.

    Код проверяет все условия, при которых возможно получить доступ к данному файлу, и решает, выдавать ли 404 или запрошенный файл.

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

  2. Используйте некоторые неочевидные возможности веб-серверов.

Рассмотрим второй вариант. Исторически я начал использовать nginx для обратного проксирования.

Покопавшись в его документации, я обнаружил, что с помощью этого сервера можно контролировать распространение файлов, проверяя права доступа непосредственно перед раздачей контента.

Итак, давайте начнем.

За 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 #разработка веб-сайтов

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.