08.11.2020
Всем привет!
Ниже покажу простой способ реализации 301-редиректов с помощью highloadblock-ов с одной страницы на другую, который часто использую в своих работах. Он реализован на обработчике событий вызываемом в начале работы пролога.
Итак, создаем новый Хайлоад-блок в админке, со следующей структурой:
Заполняем его как нам нужно (указываем с какой страницы, на какую и если что меняем активность):
Обращаю внимание!! - я добавил в код нетегированное кеширование, поэтому при изменении данных в таблице, возможно придется сбросить кеш. Возможно когда-нибудь позже переделаю на тегированное кеширование.
Далее добавляем в файл где у нас подключаюются обработчики событий (или например в init.php) следующий код:
/** * Редиректы 301 */ AddEventHandler('main', 'OnPageStart', 'OnPageStart_301_redirect'); function OnPageStart_301_redirect() { if(CModule::IncludeModule("highloadblock")) { $redirectList = []; global $APPLICATION; // Тут я сделал кеширование, для уменьшения нагрузки $obCache = new \CPHPCache(); if ($obCache->InitCache(3600, "redirectList", "/")) // при необходимости меняем время кеша { $redirectList = $obCache->GetVars(); } elseif ($obCache->StartDataCache()) { $HlBlock = \Bitrix\Highloadblock\HighloadBlockTable::getList(['filter' => ['=NAME' => 'Redirect']])->fetch(); // ТУТ не забываем менять на своё имя Хайлоад-блока if($HlBlock) { $entityDataClass = \Bitrix\Highloadblock\HighloadBlockTable::compileEntity($HlBlock)->getDataClass(); $getList = $entityDataClass::getList(); while($row = $getList->fetch()) { if($row["UF_ACTIVE"] == 1) $redirectList[$row["UF_FROM"]] = $row["UF_TO"]; } } $obCache->EndDataCache($redirectList); } if(!empty($redirectList)) { // И для самих редиректов каждый проверяет, что ему нужно на выбор if(!empty($redirectList[ $_SERVER['REQUEST_URI'] ])) LocalRedirect($redirectList[ $_SERVER['REQUEST_URI'] ], false, "301 Moved permanently"); elseif(!empty( $redirectList[ $APPLICATION->GetCurPage(false) ] )) LocalRedirect($redirectList[ $APPLICATION->GetCurPage(false) ], false, "301 Moved permanently"); elseif(!empty( $redirectList[ $_SERVER['SCRIPT_URL'] ] )) LocalRedirect($redirectList[ $_SERVER['SCRIPT_URL'] ], false, "301 Moved permanently"); } } }
И собственно все, радуемся жизни :)
Хостинг - FastVPS