При работе над одним из проектов возникла необходимость его размещения на нескольких доменах. Каждый регион (участник проекта) имеет свое доменное имя, но исходный код и база данных – общая: kiev.domain.com, kharkov.domain.com, и т.д.
Проект делается на CodeIgniter 2.0 (в связи с его ожидаемым релизом), но это не суть важно, изложенный подход работает и на 1.7.2.
Решение проблемы «в лоб» — размещение проекта на нескольких хостинг-аккаунтах, под каждым доменом – отдельно. Недостатки такого решения понятны – необходимость поддержки нескольких копий проекта, а также – затраты на хостинг.
Немного подумав, открываем файл index.php и обращаем внимание на строку 41:
Т.е. название папки с приложением можно менять в зависимости от имени домена, по которому происходит обращение к приложению:
Остаётся создать соответствующее количество копий папки application (в нашем случае они будут называться
Один из недостатков устранен – можно размещаться на одном хостинг-аккаунте. Но вопрос поддержки нескольких копий проекта остается.
Окей, идём дальше. Возвращаем строку 41 в файле index.php в начальное состояние, удаляем копии папки application.
В /application/config/ создадим конфигурационный файл
Теперь по значению
И проблема сопровождения нескольких копий приложения также устранена.
Возможно, существуют более элегантные решения, с удовольствием выслушаю предложения и замечания.
Проект делается на CodeIgniter 2.0 (в связи с его ожидаемым релизом), но это не суть важно, изложенный подход работает и на 1.7.2.
Способ 1
Решение проблемы «в лоб» — размещение проекта на нескольких хостинг-аккаунтах, под каждым доменом – отдельно. Недостатки такого решения понятны – необходимость поддержки нескольких копий проекта, а также – затраты на хостинг.
Способ 2
Немного подумав, открываем файл index.php и обращаем внимание на строку 41:
$application_folder = "application";
Т.е. название папки с приложением можно менять в зависимости от имени домена, по которому происходит обращение к приложению:
$application_folder = $_SERVER['SERVER_NAME'];
Остаётся создать соответствующее количество копий папки application (в нашем случае они будут называться
kiev.domain.com
и kharkov.domain.com
) и указать значения $config['base_url']
в файлах config.php
(т.е. – 'http://kiev.domain.com/'
и 'http://kharkov.domain.com/'
).Один из недостатков устранен – можно размещаться на одном хостинг-аккаунте. Но вопрос поддержки нескольких копий проекта остается.
Способ 3
Окей, идём дальше. Возвращаем строку 41 в файле index.php в начальное состояние, удаляем копии папки application.
В /application/config/ создадим конфигурационный файл
city.php
, который будем загружать через autoload.php
:<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
// Присвоим значения по умолчанию
$config['city'] = 'Киев';
$config['base_url'] = 'http://kiev.domain.com/';
switch($_SERVER['SERVER_NAME']) {
case('kiev.domain.com'): {
$config['city'] = 'Киев';
$config['base_url'] = 'http://kiev.domain.com/';
// возможна инициализация других параметров
break;
}
case('kharkov.domain.com'): {
$config['city'] = 'Харьков';
$config['base_url'] = 'http://kharkov.domain.com/';
// возможна инициализация других параметров
break;
}
// и другие регионы…
}
/* End of file city.php */
/* Location: ./application/config/city.php */
Теперь по значению
$this->config->item('city')
можно из контроллеров, вьювов и моделей определить, для какого региона следует генерировать вывод.И проблема сопровождения нескольких копий приложения также устранена.
Возможно, существуют более элегантные решения, с удовольствием выслушаю предложения и замечания.