Я знаю, что хранить код 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