MaxSite CMS - Мультисайтинг

Просмотров: 3841Комментарии: 11
MaxSite CMS
MaxSite CMS - Мультисайтинг

Сегодня мы поговорим о мультисайтинге на базе CMS MaxSite. Что же это за термин такой, и чем мультисайтинг примечателен? Мультисайтинг - это возможность использовать файлы движка CMS одновременно для нескольких сайтов. Таким образом, при открытии нескольких сайтов у нас будет использоваться один движок, на которые будет натянут отличный для каждого домена шаблон, и разные таблицы баз данных. MaxSite CMS своего рода конструктор, из которого можно собрать очень интересные сайты.

Какие плюсы дает мультисайтинг?

1. Более удобная структура файлов на сервере. Изменение дизайна сайтов сводится к изменению шаблонов, которые расположены в одной папке, а также обновление различных плагинов в общем каталоге.

2. Одна база данных. По желанию можно настроить работу сайтов на одну базу, лишь использовать разные префиксы для таблиц. Актуально для хостингов предоставляющих одну БД.

3. Быстрое обновление. Вам не придется обновлять движок CMS для каждого сайта отдельно.

Введение

По умолчанию движок не поддерживает такой функции, но с помощью некоторых манипуляций это легко реализуется. Ключевой фигурой тут выступает серверная переменная $_SERVER['HTTP_HOST'], с помощью которой определяется домен, по которому зашли на сайт. И от которой зависит выбор шаблона и таблиц базы данных.

Создание мультисайта на MaxSite CMS состоит из десяти шагов:

1) База данных. Файл database.php

2) Расположение папок. Файл mso-config.php

3) Убираем www из имени сайта. Файл .htaccess

4) Файл robots.txt

5) Файл sitemap.xml

6) Плагин Sitemap XML

7) Изменение структуры сайта

1. База данных. Файл database.php

Тут могут быть два разных варианта, либо одна база с использованием разных префиксов, либо несколько баз данных. Второй вариант предполагают одинаковые параметры для входа в разные базы данных. Находим файл application\config\database.php.

1-ый вариант - привязываем префикс к домену

Заменяем в найденном файле следующую строку:

$db['default']['dbprefix'] = 'mso_';

на следующий код, для определения префикса таблиц:

$mydomain = $_SERVER['HTTP_HOST'];
$mydomain = str_replace("www.", "", $mydomain);
$mydomain = str_replace("-", "", $mydomain);
$mydomain = substr($mydomain,0,strpos($mydomain,'.'));
$db['default']['dbprefix'] = $mydomain."_" ;

2-ой вариант - привязываем название базы к домену

Здесь мы используем выбор имени базы данных. Для этого заменяем следующий код:

$db['default']['database'] = '';

на такое вот интересное решение:

$mydomain = $_SERVER['HTTP_HOST'];
$mydomain = str_replace("www.", "", $mydomain);
$mydomain = str_replace("-", "", $mydomain);
$mydomain = substr($mydomain,0,strpos($mydomain,'.'));
$db['default']['database'] = 'smanager_'.$mydomain;

Для обоих вариантов

Для обоих вариантов также нужно изменить путь для кэширования запросов к базе MySql. Заменяем строку:

$db['default']['cachedir'] = 'application/cache/db/';

на следующую строку:

$db['default']['cachedir'] = 'site/'.$mydomain.'/cache/db/';

Расположение папок. Файл mso-config.php

В этом пункте мы поменяем стандартные пути к папкам на более подходяшие к мультисайтингу.

Находим файл application\maxsite\mso_config.php, и после строки:

$mso_install = true;

вставляем следующий код:

$mydomain = $_SERVER['HTTP_HOST'];
$mydomain = str_replace("www.", "", $mydomain);
$mydomain = str_replace("-", "", $mydomain);
$mydomain = substr($mydomain,0,strpos($mydomain,'.'));
$MSO->config['templates_dir']=getinfo('FCPATH').'/site/';
$MSO->config['templates_url']=$MSO->config['site_url'].'site/';
$MSO->config['uploads_dir']=
   getinfo('FCPATH').'/site/'.$mydomain.'/uploads/';
$MSO->config['uploads_url']=
   $MSO->config['site_url'].'site/'.$mydomain.'/uploads/';
$MSO->config['cache_dir']=getinfo('FCPATH').'/site/'.$mydomain.'/cache/';
$CI->config->config['cache_path']=
    getinfo('FCPATH').'/site/'.$mydomain.'/cache/';

Здесь мы в зависимости от домена изменили пути к папкам шаблонов, кэша и загрузок.

Также если вы хотите использовать разные секретные фразы для своих сайтов, то можно использовать конструкцию switch($mydomain).

3. Убираем www из имени сайта. Файл .htaccess

Использовать www в название сайта уже считается плохим тоном, и для большинства сайтов вебмастера уже настроили автоматический редирект с сайта начинающегося с этих трех букв. Также здесь же переназначем обращение к файлам sitemap.xml и robots.txt.

Перед строкой:

</IfModule>

добавляем следующий код:

RewriteRule ^sitemap.xml$ /sitemap.php
RewriteRule ^robots.txt$ /robots.php

а также еще такой код:

# В переменную окружения %{ENV:РROTOCOL} помещаем протокол
RewriteRule ^(.*)$ - [E=PROTOCOL:http]
RewriteCond %{HTTPS} ^on$ [NC]
RewriteRule ^(.*)$ - [E=PROTOCOL:https]
# Если нужно убираем www
RewriteCond %{SERVER_PORT} ^80$
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ %{ENV:РROTOCOL}://%1%{REQUEST_URI} [R=301,L]
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ %{ENV:РROTOCOL}://%1:%{SERVER_PORT}%{REQUEST_URI} [R=301,L]

4. Файл robots.txt

Вместо обычного robots.txt создадим файл robots.php формирующий разрешения поисковым роботам.

Создадим в корневой директории рядом с файлом .htaccess файл с названием robots.php, содержащий следующий код:

<?php
header("Content-type: text/plain");
echo 'User-agent: *
Disallow: /system$
Disallow: /users$
Disallow: /admin$
Disallow: /login$
Disallow: /feed$
Host: '.$_SERVER['HTTP_HOST'].'
Sitemap: http://'. $_SERVER['HTTP_HOST']. '/sitemap.xml';
?>

header тут служит для того, чтобы сервер при отдаче файла заставил браузер пользователя думать, что это текстовый файл.

5. Файл sitemap.xml

Файлы сайтмапов для поисковых систем будут расположены в подпапках сайтов. А в корне создадим sitemap.php, который будет изменять путь к настоящему sitemap.xml в зависимости от домена, следующего содержания:

<?php
header("Content-type: application/xml");
$mydomain = $_SERVER['HTTP_HOST'];
$mydomain = str_replace("www.", "", $mydomain);
$mydomain = str_replace("-", "", $mydomain);
$mydomain = substr($mydomain,0,strpos($mydomain,'.'));
echo file_get_contents('http://'. $_SERVER['HTTP_HOST'].
'/site/'. $mydomain .'/sitemap.xml');
?>

6. Плагин Sitemap XML

На данном этапе мы изменим плагин xml_sitemap для создания сайтмапа в подпапках шаблонов сайтов, а не в корневой папке. Для этого находим файл application\maxsite\plugins\xml_sitemap\index.php.

Заменяем в нем переменную выбора папки. Вместо строки:

$fn = getinfo('FCPATH') . 'sitemap.xml';

добавим следующий код:

$mydomain = $_SERVER['HTTP_HOST'];
$mydomain = str_replace("www.", "", $mydomain);
$mydomain = str_replace("-", "", $mydomain);
$mydomain = substr($mydomain,0,strpos($mydomain,'.'));
$fn = getinfo('FCPATH') .'/site/'. $mydomain .'/sitemap.xml';

Здесь главное не забыть при обновлении CMS, обновлять эти строчки, либо переименовать плагин, но для этого придется также заменить название в самом коде плагина.

7. Изменение структуры сайта

Создадим в корне сайта папку site. В этой папке будут хранится файлы шаблонов, sitemap.xml и uploads для каждого из сайтов.

В эту папку скопируем default шаблон. А также создадим папки для наших сайтов, например, для сайтов site1.ru и site2.ru создаем папки site1 и site2. В каждую из папок копируем файлы шаблонов. Также в каждой папке сайта создаем папки cache и uploads для хранения кэша и загрузок для сайтов.

Структура мультисайта будет выглядеть как-то так:

application
dumper
system
site
--default
--site1
----cache
----uploads
----sitemap.xml      
--site2
----cache
----uploads
----sitemap.xml
.htaccess
robots.php
sitemap.php
Данный метод использовал на версии MaxSite CMS 0.86, и на одном движке на момент написания статьи у меня находятся пять сайтов. Багов и артефактов в данном методе не обнаружено, все работает "как часы".

Комментариев: 11 RSS

1 MAX 15-02-2012 14:24

Адрес уже определен в $config['base_url'] или getinfo('site_url').

Убрать (или оставить) www можно в плагине range_url (главное зеркало).

Но вообще, что касается определения адреса сайта, то правильней будет предварительно задать массив сайтов, а уже после его сверять с входящим url.

Ну и плюс в статье не описано как настраивать сервер для каждого доменного имени. ;)

3 MAX 15-02-2012 16:23

Да, и еще один момент. Строго говоря, мультисайтовость заложена в CodeIgniter изначально. В главном index.php задается каталог application, который может быть разным под разные сайты.

4 Admin 15-02-2012 18:58

getinfo('site_url') может помочь только в плагине sitemap, иначе переменная еще не определена. Тоже и со второй переменной, она доступна не везде.

А на счет www, да как-то легче использовать стандартный способ, нежели пользоваться дополнительным плагином.

Про массив согласен.

5 Влад 22-02-2012 17:21

Подскажите плиз, а как проще всего сделать зеркало сайта - то есть движок один, один хостинг и база, но на каталог указывают два разные домена (такое же когда-то у меня было для wp, там сделали микро-плагин такого вида:

function newurl($data){

$blogurl=getenv('HTTP_HOST');

return "http://".$blogurl;

}

add_filter('option_siteurl','newurl');

add_filter('option_home','newurl');

по идее нужно записать $config['base_url']=getenv('HTTP_HOST'); - но где это лучше сделать? или тоже какой-то плагин?

6 Влад 22-02-2012 18:48

глянул config.php - получается, что $config['base_url'] и так определяется из переменных сервера, протупил...

7 Admin 23-02-2012 01:23

Если каталог один, то это не зеркало. Разные домены на одну папку, только с помощью панели хостера.

8 Zloy 13-03-2012 19:44

Скажите, а как с обновлениями? Потом вновь придется все переделывать?

9 Admin 13-03-2012 21:21

Придется заново) Или сохранить измененные файлы в отдельной папке и накатывать после обновления, так как они в основном не меняются, только нужно будет проверять

10 Zloy 14-03-2012 12:22

Допустим, сделаю один пароль на всех сайтах. Как с авторизацией? Будет слетать при переходе с одного на другой?

Жаль, что нет отдельного плагина для maxsite, приходится все подстраивать, подправлять.

11 Admin 14-03-2012 15:10

Авторизация привязывается к доменам. Ничего не будет слетать.

Оставьте комментарий!

grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

     

  

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email. При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д., а также подписку на новые комментарии.

(обязательно)