Редирект с несуществующих страниц в Битрикс

Ситуация:
Сделали новый сайт для компании вместо старого. Осталось заменить старый на новый. Но обычно забывают про наращённую ссылочную массу старым сайтом. Если раньше yandex проиндексировал страницу о компании по адресу /company/ , то теперь /o-kompanii/ . При переходе по старой ссылке новый сайт вернет 404 ошибку.

Задача:
Найти все рабочие ссылки ведущие на сайт и для них сделать редирект.
Решение:
Первым делом составляем список рабочих ссылок на сайт. Сделаем на примере сайта www.rbc.ru

Пишем в строку поиска yandex следующий запрос, который покажет все ссылки на ваш сайт в этой поисковой системе:
host: www.rbc.ru

Для google:
site: www.rbc.ru

Составляем файл в excel, где первая колонка старые адреса сайта, во второй новые.

lilks table

Как реализовать редирект со старых страниц на новые в 1с-Битрикс.

Логично, что, если человек перейдет на новый сайт по старым ссылкам, он получит 404 ошибку.

Проверьте, что в настройках комплексного компонента каталога->Настройки 404 ошибки, стоит устанавливать статус 404. А в настройках главного модуля->Системные ошибки должна отсутствовать галочка Посылать в заголовке статус 200 на 404 ошибку.

Находим в корне сайта файл 404.php, который создается по умолчанию. Его нужно привести к такому виду:

<?
include_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/urlrewrite.php');
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");

global  $APPLICATION;

$old = file($_SERVER['DOCUMENT_ROOT']."/redirect/old");
$new = file($_SERVER['DOCUMENT_ROOT']."/redirect/new");
foreach($old as $code => $link)
{
	$link = trim($link);
	if($APPLICATION->GetCurPage()==$link)
	{
		header("HTTP/1.1 301 Moved Permanently");
		header("Location: http://rbc.ru".trim($new[$code]));
		exit();
	}
}
CHTTP::SetStatus("404 Not Found");
@define("ERROR_404","Y");

$APPLICATION->SetTitle("404 Not Found");

$APPLICATION->IncludeComponent("bitrix:main.map", ".default", Array(
"LEVEL" => "3",
"COL_NUM" => "2",
"SHOW_DESCRIPTION" => "Y",
"SET_TITLE" => "Y",
"CACHE_TIME" => "36000000"
)
);
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>

Создаем директорию /redirect/ с двумя файлами old и new. В первый копируем все ссылке из первой колонки excel файла, а во второй файл из второй колонки. Важно, что бы сохранился одинаковый порядок и соответствие, т.е. например 3-ья ссылка из файла new должна соответствовать 3-ей ссылке из old.

Теперь разберем файл 404.php
//old файл со ссылками старого сайта
//new файл со ссылками нового сайта
//циклом проходимся по ссылкам старого сайта
//если ссылка по которой перешли на сайт, совпадает с одной из файла old, то устанавливаем код странице 301(что означает перемещен навсегда), далее идет переадресация на страницу, которая соответствует старой ссылке на новом сайте(ссылке в файле new)
Exit – прекращение выполнения скрипта.
Если в файле old не нашлось текущей страницы, то страница вернет 404 ошибку.

Редирект с адресов с параметрами.

Предыдущее решение к сожалению не учитывает переданные параметры:
http://rbc.ru/catalog/?id=2
Если на новый сайт перейдут по этой ссылке и в его структуре есть раздел /catalog/, то он не отдаст код 404, т.к. страница существует, просто передана переменная id равная 2. Мы можем воспользоваться этим.
Благо сайты с организацией такой структуры встречаются редко.

В этой ситуации можно использовать тоже самое решение, только код нужно разместить в главном шаблоне сайта:


<?
$main_page=false;
if (CSite::InDir('/index.php')){$main_page=true; }
// редирект со старых адресов
if($main_page&&(!empty($_REQUEST[id])))
{
	global $APPLICATION;
	$old = file($_SERVER['DOCUMENT_ROOT']."/redirect/old");
	$new = file($_SERVER['DOCUMENT_ROOT']."/redirect/new");
	foreach($old as $code => $link)
	{
		$link = trim($link);
		if($_REQUEST[id]==$link)
		{
			header("HTTP/1.1 301 Moved Permanently");
			header("Location: http://rbc.ru ".trim($new[$code]));
			exit();
		}
	}
}
?>

Файл new будет содержать ссылки, как и в предыдущем примере, а в old значения, которые может принимать id.

links-table2

Читайте также о том, как сделать редирект 301 с www на без www статья тут.

Если же вам нужно визуальное управление редиректами, рекомендую установить модуль Редирект Мастер.
В нем можно удобно создать редиректы через админку, загрузить их из Excel, сгенерировать редиректы при изменения ЧПУ или настроить их автоматическое создание.
Модуль доступен в Маркетплейс 1С-Битрикс.

ПоделитьсяShare on Facebook0Share on VKShare on Google+0Tweet about this on TwitterShare on LinkedIn0Pin on Pinterest0

4 комментария

  • Anatoly:

    Спасибо за статью, но ничего не понятно. Точнее по — Как реализовать редирект со старых страниц на новые в 1с-Битрикс..

    Какие должны быть списки? файл — без формата?
    Что собственно надо делать, чтобы проверить что всё работает, как понять «совпадает с одной из файла old, то устанавливаем код странице 301(» — на какой странице мы это устанавливаем? Так у меня десять тысяч страниц. Что-то я ничего не понимаю.

    • shapito27:

      Спасибо, вам за вопрос Анатолий, сейчас объясню:
      1. ‘Какие должны быть списки?’
      Например так:
      /redirect-v-bitrix/
      /kak-ubrat-adres-dostavki-pri-samovyvoze/
      /dobavit-pole-pochtovyj-shablon/
      т.е. по одной ссылке в строке, без имени домена начиная со слэша. Таким образом должен быть заполнен и файл old и new.
      2.’файл — без формата?’
      Да, я использовал файл без расширения. Вы можете поступить также, а можете создать текстовый файл какой вам угодно
      3.’Что собственно надо делать, чтобы проверить что всё работает’
      Например возьмите 3-ью ссылку из файла old и перейдите по этой ссылке, если всё настроено верно, то вас должно перекинуть на страницу по адресу, который на 3-ей строке в файле new.
      Если не срабатывает, то проверьте переменные $link и $new[$code] внутри foreach. Если в $link ссылка из файла old с первой строки, то в $new[$code] должна быть ссылка из файла new из первой строки соответственно и т.д.
      4. ‘совпадает с одной из файла old, то устанавливаем код странице 301(» — на какой странице мы это устанавливаем?’
      Это я описываю, что делает алгоритм, дополнительно что-то устанавливать не нужно всё сделает скрипт. Код 301 устанавливается на 14 строке в первом коде:
      header(«HTTP/1.1 301 Moved Permanently»);

Добавить комментарий