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");
}
}
}
И собственно все, радуемся жизни :)