CodeIgniterДинамические поддомены на CodeIgniter

Опубликовано 31 января 2009 Комментарии (5)

В этой заметке речь пойдёт о том как сделать динамические поддомены на любимом фреймворке CodeIgniter, без добавление дополнительных правил в .htaccess. Для этого мы воспользуемся замечательной возможностью роутера, а именно «default_controller» (здесь задаётся название контроллера который будет загружаться по умолчанию при вызове например www.example.com).
Я не буду описывать как настроить сервер для того что бы работали динамические поддомены, это можно почитать например тут (http://server-tuning.info/).

Для начала определим что необходимо занть нашему скрипту что бы сделать динамические поддомены:
  1. Какой домен вызван в адресной строке.
  2. Какой контроллер загружать для определённого поддомена.

Теперь начнём по порядку, для начала определим что у нас в адресной строке. Для этого напишем несколько строк кода в 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);

Как видно, с помощью этой переменной — $_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";
}

Таким образом мы загрузим контроллер «blog» если вызван адрес типа www.exemple.com, а если адрес www.login.exemple.com то загрузим контроллер «user». В месте с этим можно например добавить ещё правила для роутинга которые будут зависеть от домена.
Да, и не забудте указать основной домен и домен для cookie (что бы не было проблем с авторизацией) в настройках:

$config['base_url'] = "http://www.example.com/";
$config['cookie_domain'] = ".example.com ";

Жёстко прописать базовый домен необходимо для того что бы все ссылки по умолчанию вели на него, а для удобства работы со ссылками на поддомены можно расширить базовый url хелпер (вконце выкладываю свой хелпер), и для того что бы на поддоменах картинки и стили подгружались с основного домена, тогда браузер будет их кэшировать (экономим трафик пользователей).

Таким образом можно сделать разделы сайта на поддоменах и даже разные сайты с разными доменами на одной копии скрипта, это лишь зависит от вашей фантазии.

Если у кого-то есть другие способы для организации поддоменов или советы по улучшению данного способа буду рад услышать.
Скачать
Url helper

Метки: CodeIgniter, поддомены

Комментарии:

Big_Shark 03 февраль 2009, 07:01
Спасибо за статью) Блог в закладки)
Буду читать )
Ответить
metropolit 07 апрель 2009, 22:37
познавательно ))) и, чтоб глаза не резало, — exEmple пишется exAmple.com
Ответить
Ladygin 09 апрель 2009, 14:23
Спасибо: )
Ответить
KpNemo 26 июль 2009, 20:40
Большое спасибо за мануал, в Вашем примере есть некая ошибка. А конкретно
$valid_url = substr($URL[0], 7);
Нам не надо отсчитывать 7, ибо http:// и так не считается в HTTP_HOST. Там должен быть 0. В остальном всё работает замечательно.
И еще раз спасибо.
Ответить
Levik 21 июль 2010, 08:33
Спасибо. Делал аналогично для мультидоменов. Только base_url брал из _HOST + редирект на www. в .htaccess для склейки поисковиками
Ответить

Комментировать

*Логин:

*E-mail:
(сохранность гарантируем)

Сайт:

Aptana Class CodeIgniter Flash IDE JavaScript Linux PHP PostgreSQL SSH Ubuntu Zend Framework cms css jQuery online-приложения wordpress Базы данных Книги Кэширование ООП Ссылки Типографика вдохновение вебдизайн виджеты дизайн заголовки инструменты поддомены разработка регистрация

Блог
Новости

Новости индустрии

Пожертвовать