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. В остальном всё работает замечательно.
И еще раз спасибо.
Ответить
Ответить
Ответить
Ответить
SUBDOMAIN — это константа, значение этой константы название поддомена.
При вызове $this->config->item('subdomain'); будет выводится имя поддомена.
Ответить
Можно просто получить значение константы «SUBDOMAIN» написав SUBDOMAIN. Может что не так, заранее прошу прощения.
Ответить
Константа получает значение, но значение константы SUBDOMAIN не заменяет значение $config['subdomain']
Ответить
Ответить
Ответить
1. Как реализовать два разных поддомена? (основной и для регистрации)
2. У меня не передаётся сессия на поддомен. Почему?
Ответить