Как обновить сайт без ЧПУ и не потерять индексацию.

Недавно мне довелось переносить один сайт с какой-то там CMS на Joomla. По функциям это был сайт — каталог товаров. И если где-то в просторах интернета осталась ссылка на какой-то товар «старого» сайта, то при нажатии на нее у вас должен открыться «новый сайт» с этим-же товаром. Вроде все довольно просто, т.к. в Joomla 2.5 есть встроенный компонент перенаправления, в котором мы можем прописать старые ссылки и редиректить на новые, но… не тут то было.

На старом сайте все ссылки были неЧПУшные (httр://site.ru/index.php?cid=1&tid=2&fid=345) и поэтому встроенный модуль перенаправления просто не понимал эти ссылки, т.к. по своей сути все эти ссылки были -httр://site.ru/index.php и все остальное после этого были всего-лишь параметрами. Поэтому создавать перенаправление было бессмысленным. Первый скачанный модуль из JED действовал по такому-же принципу и мне пришлось идти другим путем:

Другой путь.

Сначала я разобрал ссылку старого сайта на составные части:
httр://site.ru/index.php?cid=2&tid=3&fid=345
cid=1 — ID основной категории (раздел)
tid=2 — ID категории товаров
fid=345 — ID товара
Пролистав старый сайт я понял, что все, что мне нужно находится в одном разделе (cid=2), далее мне надо было перенести «Реализованные объекты» (tid=1), категорию «Кирпичи» (tid=8), категорию «Блоки» (tid=2) и сами товары (fid=345 и др.)

Хотел уточнить задачу: все товары по старым ссылкам — средиректить на товары на новом сайте. Если данного товара на новом сайте нет, но он входит в категорию товаров нового сайта (например пенобетонный блок уже не выпускают, то на новом сайте просто открывается категория блоки). Если товар есть на старом сайте но на новом нет и даже категории такой нет, то дать свою 404 (например поддоны от кирпичей больше не продают и не будут, то откроется страница, где написано «Данного товара больше нет, посмотрите наши новые товары»).

Исходя из этого сслыки должны привестись к такому виду:
httр://site.ru/index.php?cid=2&tid=3&fid=345  >>>  http://site.ru/bloki/block-b01
httр://site.ru/index.php?cid=2&tid=1&fid=234  >>>  http://site.ru/realizovannye-obyekty

Со старого сайта из БД вытащил таблицу товаров (мне нужны были только блоки) и с помощью регулярок привел ее к виду:id товара — название товара
и опять зарегулярил до нужного вида:
345 => '/bloki/blok-b01'

Затем создаем файлик перенаправления:

<?php
// Массив ссылок вытащенный из БД
$arr = array(
345 => '/bloki/blok-b01',
372 => '/bloki/blok-b02',
366 => '/bloki/blok-b03',
367 => '/bloki/blok-b04',
368 => '/bloki/blok-b05',
369 => '/bloki/blok-b06',
375 => '/bloki/blok-b07',
376 => '/bloki/blok-b08',
);
// Условия перенаправления - см. блок-схему
if(isset($_GET['tid'])){
    if($_GET['tid'] == 1){
        header ('HTTP/1.1 301 Moved Permanently');
        header ('Location: /realizovannye-obyekty');
    }
    elseif($_GET['tid'] == 8){
        header ('HTTP/1.1 301 Moved Permanently');
        header ('Location: /kirpici');
    }
    elseif($_GET['tid'] == 2){
        if(isset($_GET['fid'])){
            if(isset($arr[$_GET['fid']])){
                header ('HTTP/1.1 301 Moved Permanently');
                header ('Location: '.$arr[$_GET['fid']]);
            } else {
                header ('HTTP/1.1 301 Moved Permanently');
                header ('Location: /bloki');
            }
        } else {
                header('HTTP/1.1 301 Moved Permanently');
                header ('Location: /bloki');
            }
    } else {
        header ('HTTP/1.0 404 Not Found');
        header ('Location: /404');
    }
} else {
    include('joomlaindex.php');
}

Что делает этот файл — смотрим блок схему.

Что дальше делаем?

 

Переименовываем стандартный файл (в КОРНЕ САЙТА… не в шаблоне) index.php в joomlaindex.php (взгляните на последнюю строчку кода) и наш файлик перенаправления сохраняем как index.php и кладем в корень сайта, после этого правим файл .htaccess

В самом начале файла добавляем

DirectoryIndex joomlaindex.php
и затем 38 и 74 строка (по умолчанию в joomla 2.5)

RewriteRule .* index.php [F]
RewriteRule .* index.php [L]

приводим к виду:

RewriteRule .* joomlaindex.php [F]
RewriteRule .* joomlaindex.php [L]

И если убрать комментарии из файла, то должно получится так:

# Добавлена 2 строка ... 9 и 15 переименовано index.php в joomlaindex.php
DirectoryIndex joomlaindex.php
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{QUERY_STRING} base64_encode[^(]*\([^)]*\) [OR]
RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
RewriteRule .* joomlaindex.php [F]
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteCond %{REQUEST_URI} !^/index\.php
RewriteCond %{REQUEST_URI} /component/|(/[^.]*|\.(php|html?|feed|pdf|vcf|raw))$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* joomlaindex.php [L]

Если вы не правили htaccess — то смело копипасьте, вместе с первой строкой комментария, она понадобится в будущем.

Готово:
httр://site.ru/index.php?cid=2&tid=3&fid=345  >>>  http://site.ru/bloki/block-b01
httр://site.ru/index.php?cid=2&tid=1&fid=234  >>>  http://site.ru/realizovannye-obyekty
Работает.

Сразу хочу предупредить — при обновлении наш файлик заменится стандартным от Joomla и сайт перестанет перенаправлять, поэтому бэкапьте файлы.

Ну и еще по опыту: Через 2 недели (2 апа) в Яндексе все ваши ссылки переиндексируются и в выдаче вместо старых кракозябл будут новенькие ЧПУшные со стареньким весом (если таковой имелся).Если ваша миссия на этом закончена, то удаляем наш index.php, файлик joomlaindex.php переименовываем в index.php и из файла .htaccess удаляем 2 строку и меняем 9 и 15 (я комментарии написал в этом файле — они на первой строке).

Кирпичи и блоки вымышленные. В оригинале у меня совсем другая продукция и горАздо бОльший массив из товаров.(не адалт и не варез, просто не афиширую)

4 комментария
Просто мега статья, были подобные мысли, но тут почти что все готовое… только бери и пользуйся.
Pazys, спасибо! Отличный материал!
ну что скажешь.век живи век учись…Самое главное что есть у кого ;)СПАСИБО! на 300% уверен пригодится. Пар ураз отказывался из-за того что надо было вот такие схемы выстраивать. Это не всегда так просто как изложено тут, но логика представлена исключительно. Спасибо ;)
Статья очень хорошая! Я только решил, что нет смысла создавать файл joomlaindex.php, я весь php код написал в index.php и все работает, было shop?page=shop.browse&category_id=9 стало shop/lesopilomaterialy
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.