Ситуация:
Сделали новый сайт для компании вместо старого. Осталось заменить старый на новый. Но обычно забывают про наращённую ссылочную массу старым сайтом. Если раньше yandex проиндексировал страницу о компании по адресу /company/ , то теперь /o-kompanii/ . При переходе по старой ссылке новый сайт вернет 404 ошибку.
Задача:
Найти все рабочие ссылки ведущие на сайт и для них сделать редирект.
Решение:
Первым делом составляем список рабочих ссылок на сайт. Сделаем на примере сайта www.rbc.ru
Пишем в строку поиска yandex следующий запрос, который покажет все ссылки на ваш сайт в этой поисковой системе:
host: www.rbc.ru
Для google:
site: www.rbc.ru
Составляем файл в excel, где первая колонка старые адреса сайта, во второй новые.
Как реализовать редирект со старых страниц на новые в 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.
Читайте также о том, как сделать редирект 301 с www на без www статья тут.
Если же вам нужно визуальное управление редиректами, рекомендую установить модуль Редирект Мастер.
В нем можно удобно создать редиректы через админку, загрузить их из Excel, сгенерировать редиректы при изменения ЧПУ или настроить их автоматическое создание.
Модуль доступен в Маркетплейс 1С-Битрикс.
Спасибо за статью, но ничего не понятно. Точнее по — Как реализовать редирект со старых страниц на новые в 1с-Битрикс..
Какие должны быть списки? файл — без формата?
Что собственно надо делать, чтобы проверить что всё работает, как понять «совпадает с одной из файла old, то устанавливаем код странице 301(» — на какой странице мы это устанавливаем? Так у меня десять тысяч страниц. Что-то я ничего не понимаю.
Спасибо, вам за вопрос Анатолий, сейчас объясню:
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»);
что за? $_SERVER[
откуда эти знаки и цифры ?
Спасибо, Андрей, поправил код.
Это редактор перевел в html безопасный вид квадратную скобку.