301 - Редиректы для битрикс на хайлод-блоках (highloadblock)

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");
		}
	}
}

И собственно все, радуемся жизни :)


Возврат к списку