Быстрая CMS
Обратная связь Карта сайта
Главная Создание сайтов Практика Строим CMS Наивное О проекте Блог

Смена движка и формата URL

Это очень частый вопрос на SEO- и просто вебмастерских форумах – как поступать, когда вместе с новым движком (или просто его новой версией) меняется формат всех ссылок на сайте. Посетителей, пришедших по ссылкам или с закладок, надо направить по новому адресу. Поисковым ботам нужно быстро дать понять, что адреса страниц изменились. Нужно массовое перенаправление со старых адресов на новые.

Хорошо, когда все URL меняются единообразно и изменения укладываются в шаблоны правил для mod_rewrite. К сожалению, чаще всего это не так. Новый движок «привязывает» URL страницы по-иному и без обращения к базе данных нужные идентификаторы получить нельзя. А модуль mod_rewrite не всемогущ, он к базам данных обычно не обращается (опустим разработки для собственного сервера с применением скриптов на Perl).

Выход есть. И когда вы внедрили псевдостатику (ЧПУ) взамен «динамических» ссылок с параметрами, и если вы сменили формат ЧПУ. Обычно движки с поддержкой псевдостатики сделаны так, что все запросы передаются «главному» скрипту, обычно index.php. А там уже идет разбор запрошенного URL и исполнение нужных модулей. Нам остается только дополнить этот разбор своей проверкой. Единственная трудоемкая операция – собрать список старых URL и соответствующих им новых. К счастью, это надо сделать только один раз.

Собираем список в текстовый файл. Назовем его, к примеру, redirect.csv и разместим в корне сайта. Формат CSV – в каждой строке два значения через разделитель. По понятным причинам в качестве разделителя нужно выбирать символ, который в URL встречаться не должен. Мне нравится вертикальная черта, так что я ее и использую для примера. У нас должно получиться что-то наподобие:


/index.php?articleid=123|/articles/kak-nam-obustroit-sajt.html
/index.php?articleid=123&page=2|/articles/kak-nam-obustroit-sajt_2.html
/index.php?articleid=238|/articles/o-nas-i-o-nashem-sajte.html

И так далее, сколько нам нужно, главное – не нарушать формат. Не нужно ни пустых строк, ни пробелов. Хотя если в начале, в конце, или около разделителя все-таки попадутся пробелы, это не страшно, уберем при обработке. Лишь бы посреди URL не появилось ничего лишнего.

Теперь готовим скрипт, который будет обрабатывать эту таблицу перенаправлений. Недолго думая, назовем его redirect.php.


<?php
// Какой URL у нас запросили?
$rq_uri = $_SERVER['REQUEST_URI'];
// Считываем файл как массив строк
$a_src = file('./redirect.csv');
// Разбираем каждую строку как элемент нового массива:
// в нем старый URL становится индексом, а новый – значением
$a_rdr = array();
foreach ($a_src as $val) {
  // Разбивка по разделителю
  $a_0 = explode('|', $val);
  // Добавление в массив с попутной зачисткой пробелов
  $a_rdr[trim($a_0[0])] = trim($a_0[1]);
}
// После этого цикла у нас готова таблица редиректов
// Массив строк файла уничтожаем – он больше не нужен
unset($a_src);
// Теперь осталось проверить, есть ли запрошенный URL среди старых
// Если есть, то перенаправляем на соответствующий новый и на этом завершаем работу
if (!empty($a_rdr[$rq_uri])) {
  header($_SERVER['SERVER_PROTOCOL']. ' 301 Moved Permanently');
  header('Location: http://'.$_SERVER['HTTP_HOST'].$a_rdr[$rq_uri]);
  exit();
} else {
  // А если запрошенного URL среди старых не нашлось,
  // уничтожаем таблицу, чтоб не занимала память и пусть index.php работает дальше
  unset($a_rdr);
}
?>

Вот, собственно, и всё решение. Даже если нам нужно перенаправить тысячи разных URL, этот маленький скриптик справится с такой задачей максимально быстро и не отберет много памяти. Осталось только подключить всю эту конструкцию к действующему движку. Для этого достаточно забросить наш redirect.php туда же, в корень сайта, а потом в самом начале «главного» скрипта index.php добавить его вызов:


include('./redirect.php');

Теперь все останутся довольны – и посетители, и боты поисковых систем. Главное – ничего не упустить, собирая список перенаправлений, тогда сайт достаточно легко будет переиндексирован по новым адресам.