Массовый 301й редирект для HostCMS

#
Массовый 301й редирект для HostCMS
По просьбам трудящихся

0. Задача.
Был сайт на левой cms'ке с адресами http://www.mysite.ru/index.php?id=nasosy
Его перенесли на HostCMS и адресация стала http://www.mysite.ru/nasosy/
Надо сделать редиректы со старых страниц на новые.

1. Подготовка.
Для начала надо определиться с соответствиями старым страницам новых. Из этих соответствий нужно сделать массив:
<?
$redirects['/index.php?id=nasosy'] = '/nasosy/';
$redirects['/index.php?id=nasosy2'] = '/nasosy/';
$redirects['/index.php?id=nasosy2&sub=bytovye'] = '/nasosy/bytovye/';
$redirects['/index.php?id=motory'] = '/motory/';
?>
В примере 4 страницы, как видим, несколько старых страниц могут ссылаться на одну новую. Иерархия тоже поддерживается.
Создали массив. Теперь нужно узнать id _нового_ сайта в системе HostCMS. Делается это в ЦА, в разделе Сайты. Допустим, id нашего сайта = 2. Тогда сохраняем наш массив в файл под именем site2.php (цифра после слова site = идентификатору сайта.
Создаем в корневой папке HostCMS папочку под названием redirects и кладем наш файл туда.

2. Решение.
Само решение по массовому редиректингу реализуется с помощью еще одного php-файла. Создаем в корневой папке HostCMS файл с названием redirecter.php и помещаем в него следующий код:
<?php

/**
* HostCMS Mass 301 Redirecter
*
* @author Eugene Strigo aka James V. Kotov
* @copyright 2010
*
*/

// получим запрашиваемый url
$uri = $_SERVER['REQUEST_URI'];

// получим путь к текущей папке
$script_dir = dirname(__file__) . '/';

if ($uri != '/') {
   // если пользователь обратился не на корень то:


    /* поднимаем ядро HostCMS */

    // Подключаем основные классы
    require_once ($script_dir . 'main_classes.php');

    // создадим экземпляр ядра
    $kernel = &singleton('kernel');

    // Загрузка модулей
    $kernel->LoadModules();

    /* подняли ядро HostCMS */


    // создадми экземпляр объекта site
    $site = &singleton('site');

    // Получаем ID текущего сайта по алиасу (HTTP_HOST)
    $alias_row = $site->GetAlias($domain);

    if ($alias_row) {
        // если получение прошло успешно, то:

        // вычислим путь к файлу редиректов для текущего сайта
        $redir_base_file = $script_dir . 'redirects/site' . $alias_row['site_id'] . '.php';

        if (file_exists($redir_base_file)) {
            // проверим, существует ли файл редиректов для текущего сайта

            // если файо существует, то:

            // подключим файл с массивом редиректов
            include_once ($redir_base_file);

            if (is_array($redirects) && isset($redirects[$uri])) {
                // если в массиве редиректов описан текущий url

                // получим основной домен для текущего сайта
                $current_alias = $site->GetCurrentAlias($alias_row['site_id']);

                // вычислим ссылку
                $new_url = 'http://' . $current_alias . $redirects[$uri];

                // выполним редирект
                header('HTTP/1.1 301 Moved Permanently');
                header('Location: ' . $new_url);

                // закончим выполнение скрипта.
                exit();

            } else {

                // прибьем массив редиректов, чтобы не захламлять память
                unset($redirects);
            }
        }
    }
}

// подлючим основной index.php
require_once ($script_dir . 'index.php');

?>


3. Включение
Просто создать файл redirecter.php - мало. Надо еще и перенаправить на него все входящие запросы. Для этого открываем файл .htaccess, расположенный в корневой папке HostCMS, и ищем там такие строчки:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php

В последней строке меняем index.php на redirecter.php и сохраняем изменения.

Внимание! Если у вас в файле redirecter.php будут синтаксические ошибки, то упадет работа вообще всех сайтов, которые есть у вас в системе (если повезет то будут работать только их морды, если не повезет то не будет работать ничего вообще).
Если у вас будут синтаксические ошибки в файле /redirects/site2.php то перестанет работать только сайт с id = 2.
Если это случилось - быстренько меняем в .htaccess redirecter.php обратно на index.php и ищем ошибки.


Что плохо.
Во1х, не ясно как устроен изнутри index.php и как происходит инициализация модулей. Есть предположения, что двойное "поднимание" ядра HostCMS, сначала в редиректере а потом в индексе, может привести к перерасходу памяти.
Может быть разработчики что-нибудь уточнят по этому вопросу?

Во2х, никто кроме администратора не следит за изменениями путей на новом сайте. Если вы где-то изменили пути после создания файла site2.php, например вместо /nasosy/ решили написать /pumps/, то вы должны сами вручную исправить /nasosy/ на /pumps/ везде где оно встречается в файле site2.php
По-хорошему, надо бы написать модуль, в котором соответствие бы сохранялось не в качестве абсолютных url и в виде идентификаторов групп/элементов ИМ/ИС или идентификторов узлов структуры, по которым нужный урл для редиректинга вычислялся бы автоматически.
Заказов не беру. Консультирую редко.
#
Re: Массовый 301й редирект для HostCMS
Kotoff писал(а):
... соответствие бы сохранялось не в качестве абсолютных url А в виде идентификаторов...

опечатка.
Заказов не беру. Консультирую редко.
#
Re: Массовый 301й редирект для HostCMS
Потестил, но что-то не работает.
Сайт продолжает работать в прежнем режиме но запросы не проходят - просто кидает на главную страницу.
ку
#
Re: Массовый 301й редирект для HostCMS
compaq, значит как всегда что-то не правильно сделали
Скрипт скопирован с рабочего сайта, где уже три недели вовсю редиректит посетителей
Пример массива скопирован оттуда же, только в нем изменены адреса.
Вы-то в массиве свои редиректы прописали? У вас на сайте есть те адреса куда вы редиректите?
Заказов не беру. Консультирую редко.
#
Re: Массовый 301й редирект для HostCMS
Kotoff писал(а):
Вы-то в массиве свои редиректы прописали?

Канечно

Kotoff писал(а):
У вас на сайте есть те адреса куда вы редиректите?

тем более -)

ку
#
Re: Массовый 301й редирект для HostCMS
compaq, стучитесь, взгляну.
Заказов не беру. Консультирую редко.
#
Re: Массовый 301й редирект для HostCMS
Евгений черканул вам на почту -))
ку
#
Re: Массовый 301й редирект для HostCMS
Ну что ж, всякое случается, на этот раз я оказался недостаточно предусмотрителен

Дело в том, что у compaq, старые адреса сайте имеют вид
mysite.ru/index.php?name=Archive

и естественно даже при указании редиректера в .htaccess все равно напрямую обрабатываются индексом, потому как не попадают под наложенные на редиректер условия.

(Тут поясню наверное немного. Запись
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /redirecter.php
означает следующее - если запрашивается не существующий файл или несуществующая папка, то запрос прозрачно переадресовывается файлу redirecter.php, который в свою очередь уже может делать с ним что захочет. А так как файл index.php очень даже существует, то мы имеем прямое обращение к нему.)


Что делать? Добавить в .htaccess после вышепроцитированного правила еще одно:
RewriteCond %{REQUEST_URI} ^/index.php(.*)$
RewriteRule ^(.*)index.php(.*)$ /redirecter.php

Буквально - если мы запрашиваем непосредственно index.php то прозрачно переадресуем запрос к redirecter.php

Как-то так
Заказов не беру. Консультирую редко.
#
Re: Массовый 301й редирект для HostCMS
Ну и, конечно, извиняюсь перед compaq за
Kotoff писал(а):
значит как всегда что-то не правильно сделали

В этот раз причина была в недостаточной проработанности предложенного мною решения.
Пардон.
В следующий раз постараюсь быть вдумчивее
Заказов не беру. Консультирую редко.
#
Re: Массовый 301й редирект для HostCMS
Евгений спасибо большое!  
ку
Авторизация