Использование динамических поддоменов в Code Igniter
Code Igniter, как и множество других фреймворков, поддерживает функционал мультиприложения: одно ядро и множество каталогов-приложений. Выбор нужного приложения производится в index.php, путем изменения значения переменной:
$application_folder = "../test"; |
Иногда перед разработчиком встает задача запуска разных приложений в зависимости от параметров URI. Это может быть как обычный параметр GET, POST, значение сессии, поддомен или что-то еще.
Когда может пригодиться функционал мультиприложения?
У вас независимые CMS + Форум + Магазин + Статистика. Хотя приведенный пример можно реализовать и через простые модули, но попадаются примеры и сложнее. К примеру, у нас конечный продукт интернет-магазин и нам надо предоставить демо-режим. Или, к примеру, у нас есть три компании-клиента, и мы хотим, чтобы у каждой компании был независимый форум + блог разработчика (Форум + Форум + Форум + Блог). Тиражирование каталога с приложением «форум» отметаем сразу, и попробуем реализовать задуманное через настройку пути приложения с передачей параметра через поддомены.
Что такое поддомен?
Для адреса некой веб-страницы вида http://sub.cite.com — «sub» является его поддоменом.
Что бы выбрать нужное приложение необходимо определить какой поддомен был вызван, для этого в начало index.php добавим код:
$sub = ''; if (isset ($_SERVER['HTTP_HOST'])) { $url_path = explode('.', $_SERVER['HTTP_HOST']); if (count($url_path) == 3 AND $url_path[0] != 'www') { $sub = $URL[0]; } if (count($url_path) == 4 ) { $sub = $url_path[1]; } unset($url_path); } else { } define('SUB', $sub); |
В переменной $_SERVER[‘HTTP_HOST’] содержится имя сервера. Для того, чтобы определить поддомен, воспользуемся простым алгоритмом: разобьем строку, содержащую URL на подстроки (в качестве разделителя используем точки «.»), и результат разбиения занесем в массив. Так как URL может содержать префикс www, то возможны два варианта: www.sub.cite.com и sub.cite.com. Проверим оба. Если проверка была успешной, занесём в константу SUB имя поддомена — она нам еще пригодится.
Итак. Поддомен определили. Далее нужно указать папку с нужным приложением. Для простого случая, когда у нас несколько приложений и некоторым поддоменам соответствует своё, уникальное приложение используем следующий код (index.php):
switch(SUB) { case 'blog': $application_folder = "../blog"; break; case 'forum': $application_folder = "../forum"; break; case 'forum2': $application_folder = "../forum"; break; case 'forum3': $application_folder = "../forum"; break; default: $application_folder = "../app"; } |
В каталоге ../forum будет находится приложение с форумом. Для того, что бы в зависимости от поддомена загружались разные форумы необходимо:
1. Создать конфигурационные файлы, описывающие настройку приложения форум для каждого поддомена. Для гибкости конфигурирования будем хранить все настройки в БД, а в файлах с настройками хранить префикс для таблиц.
Внимательный читатель уже заметил, что имя файла с конфигурацией соответствует шаблону cfg_{поддомен}.php.
2. Загрузить нужный конфиг. Это можно сделать в конструкторе модели:
function __construct() { parent::__construct(); $this->config->load('cfg_'.SUB); $this->table_prefix = $this->config->item('table_prefix'); } |
Все обращения к БД перепишем, добавив использование префикса:
$sql = "SELECT * FROM `{$this->table_prefix}posts` ORDER BY post_time DESC"; |
3. Изменить код определения base_url (в главном конфиге ../forum/config/config.php):
$root = "http://".$_SERVER['HTTP_HOST']; $root.= str_replace(basename($_SERVER['SCRIPT_NAME']),"",$_SERVER['SCRIPT_NAME']); $config['base_url'] = "$root"; |
Подобный код будет полезен и для других проектов, позволяя забыть о настройке этого параметра.
Вот и всё.
Данный подход имеет свои плюсы и минусы.
Плюсы:
- У нас одно приложение — для обновления версии и всех приложений необходимо обновить единственный каталог;
- Нет copy & paste — это вселенское зло;
- Таблицы разных приложений находятся в одной БД — можно обращаться друг к другу и выводить данные из других приложений (хорошо для администрирования);
Минусы:
- Хардкорное добавление — чтобы добавить еще одно приложение, необходимо внести правки в файл, создать таблицы и конфиг;
- Если нужны не однотипные приложения — придется делать расширенную конфигурацию и в отображениях учитывать множество параметров;
- Невозможно просмотреть список созданных приложений (кроме как напрямую в коде index.php);
В следующий раз мы попробуем исправить минусы и сделать более универсальным данное решение.