Я пытаюсь найти лучший способ добавить проверку аутентификации к запросам статических ресурсов на моем сервере.
Я использую Apache2.4 и PHP / Laravel, которые работают, обслуживая статический контент непосредственно из DocumentRoot
и входит в index.php
для обработки динамических маршрутов.
Я искал и нашел пару вариантов, но не уверен, какой будет консенсус в отношении лучших практик и наиболее эффективных:
1) Создайте и установите ActionHandler в Apache для вызова сценария CGI для обслуживания статического содержимого. Этот сценарий будет открывать соединение с БД для каждого запроса, проверять права управления доступом и возвращать 301 или обслуживать контент. Я считаю, что производительность сильно снизится из-за открытия нового соединения с БД для каждого запроса.
Я пытался добавить:
Action serve-static /var/www/file-server.py
AddHandler serve-static .js .css
к <Directory>
block, но из-за этого все css / js возвращали 404.
2) Используйте комбинацию из mod_rewrite
и mod_proxy
чтобы проксировать все запросы статических файлов на другой сервер приложений (или балансировать нагрузку на несколько), у которых уже будет открытое соединение с БД, выполнить проверку аутентификации и вернуть файл соответствующим образом. Меня беспокоит этот подход, потому что я думаю, что Apache может стать узким местом на нисходящем канале обратно к клиенту?
Я начинаю с <Directory /var/www/html/app/public>
блок, содержащий все приложение
Я не очень хорошо знаком с mod_rewrite
и mod_proxy
, поэтому я думаю, что мог бы создать что-то вроде
<Directory /var/www/html/app/public/static>
RewriteEngine on
RewriteRule "(.*)$" "http://fileserver/$1" [P]
ProxyPassReverse "/public/static" "http://fileserver/"
</Directory>
Но я не могу получить это для прокси-запросов к уровню файлового сервера даже для проверки эффективности.
Любое понимание здесь будет оценено!
Если статический контент уже находится на веб-сервере, начните с простого. Пропустите (пока) сценарий CGI, прокси, перезапись URL и кеширование.
В директиве Directory для статического использования используйте модули аутентификации httpd чтобы заблокировать это. Вы подразумеваете соединение с БД, что означает mod_authn_dbd и mod_authz_dbm, и требуете, чтобы ваша база данных имела хэши паролей, поддерживаемые модулями.
В конечном итоге вам понадобится кеширование, несколько запросов к БД на документ не работают. Реализация Apache mod_authn_socache, и он может помещать аутентификацию в свой общий кеш объектов, который может поддерживаться общей памятью, memcached и т. д.
Вы можете сделать подобное кеширование в рамках своего веб-приложения. Это упражнение для читателя, поскольку это больше разработка, чем настройка веб-сервера.