Ситуация:
Сделали новый сайт для компании вместо старого. Осталось заменить старый на новый. Но обычно забывают про наращённую ссылочную массу старым сайтом. Если раньше 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, который создается по умолчанию. Его нужно привести к такому виду:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <? 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" ); 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. Мы можем воспользоваться этим.
Благо сайты с организацией такой структуры встречаются редко.
В этой ситуации можно использовать тоже самое решение, только код нужно разместить в главном шаблоне сайта:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <? $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" ); 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 безопасный вид квадратную скобку.