CodeIgniter → Динамические поддомены на CodeIgniter
В этой заметке речь пойдёт о том как сделать динамические поддомены на любимом фреймворке CodeIgniter, без добавление дополнительных правил в .htaccess. Для этого мы воспользуемся замечательной возможностью роутера, а именно «default_controller» (здесь задаётся название контроллера который будет загружаться по умолчанию при вызове например www.example.com).
Я не буду описывать как настроить сервер для того что бы работали динамические поддомены, это можно почитать например тут (http://server-tuning.info/).
Для начала определим что необходимо занть нашему скрипту что бы сделать динамические поддомены:
Теперь начнём по порядку, для начала определим что у нас в адресной строке. Для этого напишем несколько строк кода в index.php:
Как видно, с помощью этой переменной — $_SERVER['HTTP_HOST'] получаем домен к которому обратился клиент, затем разбираем её и записываем результат в константу SUBDOMAIN, что бы сохранить полученный результат. Если у нас вызван основной домен то передаём нашей константе FALSE, а если вызван поддомен то передаём имя поддомена, например «blog», «forum» и т.д.
Для того что бы имя поддомена было доступна из конфига добавляем одну строку в aplication/config/config.php:
Теперь что бы узнать какой поддомены вызван (или основной домен) нужно вызвать:
Теперь наш скрипт знает какой домен вызван, осталось научить его загружать разные контроллеры для определённого домена, приступим.
Для примера покажу как я сделал поддомены для пользователей на данном сайте. Для этого открываем файл aplication/config/routes.php и добавляем код:
Таким образом мы загрузим контроллер «blog» если вызван адрес типа www.exemple.com, а если адрес www.login.exemple.com то загрузим контроллер «user». В месте с этим можно например добавить ещё правила для роутинга которые будут зависеть от домена.
Да, и не забудте указать основной домен и домен для cookie (что бы не было проблем с авторизацией) в настройках:
Жёстко прописать базовый домен необходимо для того что бы все ссылки по умолчанию вели на него, а для удобства работы со ссылками на поддомены можно расширить базовый url хелпер (вконце выкладываю свой хелпер), и для того что бы на поддоменах картинки и стили подгружались с основного домена, тогда браузер будет их кэшировать (экономим трафик пользователей).
Таким образом можно сделать разделы сайта на поддоменах и даже разные сайты с разными доменами на одной копии скрипта, это лишь зависит от вашей фантазии.
Если у кого-то есть другие способы для организации поддоменов или советы по улучшению данного способа буду рад услышать.
Скачать
Url helper
Я не буду описывать как настроить сервер для того что бы работали динамические поддомены, это можно почитать например тут (http://server-tuning.info/).
Для начала определим что необходимо занть нашему скрипту что бы сделать динамические поддомены:
- Какой домен вызван в адресной строке.
- Какой контроллер загружать для определённого поддомена.
Теперь начнём по порядку, для начала определим что у нас в адресной строке. Для этого напишем несколько строк кода в index.php:
//Динамические поддомены
$URL = explode('.', $_SERVER['HTTP_HOST']);
$valid_url = false;
if (count($URL) == 3 AND $URL[0] != 'www') {
$valid_url = substr($URL[0], 7);
}
if (count($URL) == 4 ) {
$valid_url = $URL[1];
}
unset($URL);
define('SUBDOMAIN', $valid_url);
$URL = explode('.', $_SERVER['HTTP_HOST']);
$valid_url = false;
if (count($URL) == 3 AND $URL[0] != 'www') {
$valid_url = substr($URL[0], 7);
}
if (count($URL) == 4 ) {
$valid_url = $URL[1];
}
unset($URL);
define('SUBDOMAIN', $valid_url);
Как видно, с помощью этой переменной — $_SERVER['HTTP_HOST'] получаем домен к которому обратился клиент, затем разбираем её и записываем результат в константу SUBDOMAIN, что бы сохранить полученный результат. Если у нас вызван основной домен то передаём нашей константе FALSE, а если вызван поддомен то передаём имя поддомена, например «blog», «forum» и т.д.
Для того что бы имя поддомена было доступна из конфига добавляем одну строку в aplication/config/config.php:
$config['subdomain'] = SUBDOMAIN;
Теперь что бы узнать какой поддомены вызван (или основной домен) нужно вызвать:
$this->config->item('subdomain');
Теперь наш скрипт знает какой домен вызван, осталось научить его загружать разные контроллеры для определённого домена, приступим.
Для примера покажу как я сделал поддомены для пользователей на данном сайте. Для этого открываем файл aplication/config/routes.php и добавляем код:
if (SUBDOMAIN !== FALSE) {
$route['default_controller'] = "user";
//Сюда можно написать ещё правила для роутинга пользователя
}
else {
$route['default_controller'] = "blog";
}
$route['default_controller'] = "user";
//Сюда можно написать ещё правила для роутинга пользователя
}
else {
$route['default_controller'] = "blog";
}
Таким образом мы загрузим контроллер «blog» если вызван адрес типа www.exemple.com, а если адрес www.login.exemple.com то загрузим контроллер «user». В месте с этим можно например добавить ещё правила для роутинга которые будут зависеть от домена.
Да, и не забудте указать основной домен и домен для cookie (что бы не было проблем с авторизацией) в настройках:
$config['base_url'] = "http://www.example.com/";
$config['cookie_domain'] = ".example.com ";
$config['cookie_domain'] = ".example.com ";
Жёстко прописать базовый домен необходимо для того что бы все ссылки по умолчанию вели на него, а для удобства работы со ссылками на поддомены можно расширить базовый url хелпер (вконце выкладываю свой хелпер), и для того что бы на поддоменах картинки и стили подгружались с основного домена, тогда браузер будет их кэшировать (экономим трафик пользователей).
Таким образом можно сделать разделы сайта на поддоменах и даже разные сайты с разными доменами на одной копии скрипта, это лишь зависит от вашей фантазии.
Если у кого-то есть другие способы для организации поддоменов или советы по улучшению данного способа буду рад услышать.
Скачать
Url helper
Метки: CodeIgniter, поддомены



Комментарии:
Буду читать )
Ответить
Ответить
Ответить
$valid_url = substr($URL[0], 7);
Нам не надо отсчитывать 7, ибо http:// и так не считается в HTTP_HOST. Там должен быть 0. В остальном всё работает замечательно.
И еще раз спасибо.
Ответить
Ответить