Недавно мне довелось переносить один сайт с какой-то там 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 (я комментарии написал в этом файле — они на первой строке).
Кирпичи и блоки вымышленные. В оригинале у меня совсем другая продукция и горАздо бОльший массив из товаров.(не адалт и не варез, просто не афиширую)