Назад | Перейти на главную страницу

Доступ к общедоступным файлам в веб-приложении с модульной структурой

Я знаю, что хранить код php-приложения вне общей папки - это хорошая идея, но это создает проблему.

Допустим, мы хотели бы создать полностью модульную структуру, подобную этой:

modules
   shop
      css
      js
      images
      controllers
      templates
   chat
      css
      js
      images
      controllers
      templates

Очевидно, мы хотели бы защитить контроллеры и папки шаблонов от прямого доступа. Но если мы поместим модули вне общей папки, мы не сможем напрямую серверить js / css / images. Мы не хотели бы создавать копию той же модульной структуры в общей папке только для файлов css / js.

Поэтому, если мы «нарушим правило» и поместим все модули в общую папку, чтобы разрешить доступ к css / js / images, у нас возникнут потенциальные проблемы с безопасностью. Мы могли бы просто поместить файлы .htaccess в каждую из этих папок, но в любом случае это не кажется безопасным - что, если кто-то забудет добавить .htaccess?

Итак, вопрос: есть ли способ сохранить модульную структуру в одном безопасном месте (например, вне общедоступного корня) и по-прежнему разрешить прямой доступ к css / js / images? Любая конфигурация Apache, rewriterule или какой-нибудь трюк?

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

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

Например, вы можете объединить CSS из разных модулей в один файл или изменить удобочитаемый JavaScript в сильно минимизированной версии.


Другой способ сделать это - создать общую папку внутри каждого модуля. Затем используйте псевдонимы и / или правила перезаписи, чтобы направлять запросы в соответствующее место. Используя <Directory> директиве вы можете установить явные разрешения для папок вне корня документа. Однако выполнение этого способа, вероятно, потребует от вас перенастраивать Apache каждый раз, когда вы добавляете модуль.

Что-то вроде этого может сработать:

<Directory "/Docroot">
   ...
   RewriteRule ^(shop|chat)/(.*) /path/to/modules/$1/public/$2
   ...
</Directory>
<DirectoryMatch "^/path/to/modules/(.+)/public">
  Order Allow,Deny
  Allow from All
  ...
</DirectoryMatch>

Наконец, когда вы «устанавливаете» свой модуль, вы можете просто скопировать общедоступные файлы в корень документа. Вы все еще можете оставить разделенные. Что-то вроде этого:

modules
   shop
      controllers
      templates
   chat
      controllers
      templates
public
   modules
       shop
          css
          js
          images
       chat
          css
          js
          images