Joomla - страница ошибки с редиректом для посетителей

Joomla - страница ошибки с редиректом для посетителей

Идея перенаправлять посетителей сайта со страницы ошибки на любую другую страницу сайта не нова, но редиректить всей посетителей все же не совсем верно. Тем же администратору нужно видеть страницы с ошибками, да и поисковым роботам все таки стоит отдавать правильный ответ а не 301. Ну и свое сообщение написать иногда нужно.

Первоначально я хотел сделать универсальное решение, но в итоге пришел к выводу что стоит разделить на обычную версию и для мультиязычных сайтов.

Для использования данного хака необходимо переопределить вывод страницы ошибок в выбранном шаблоне сайта. Для этого создайте файл error.php в папке вашего шаблона по адресу /templates/you_template/error.php со следующим содержимым.

<?php
/**
 * @package    	Error page with visitor redirect
 * @version     1.0
 * @author      Igor Berdicheskiy - septdir.ru
 * @copyright   Copyright (c) 2013 - 2017 Igor Berdicheskiy. All rights reserved.
 * @license     GNU/GPL license: http://www.gnu.org/copyleft/gpl.html
 */
defined('_JEXEC') or die('Restricted access');
/* Settings
========================================================================== */
$url = '/'; // Custom Redirect page
$message = ''; // Custom Message
$administrator = 3; // Administrator Access Level /administrator/index.php?option=com_users&view=levels
$botList = array('rambler', 'googlebot', 'aport', 'yahoo', 'msnbot', 'turtle', 'mail.ru', 'omsktele', 'yetibot', 'picsearch', 'sape.bot', 'sape_context', 'gigabot', 'snapbot', 'alexa.com', 'megadownload.net', 'askpeter.info', 'igde.ru', 'ask.com', 'qwartabot', 'yanga.co.uk', 'scoutjet', 'similarpages', 'oozbot', 'shrinktheweb.com', 'aboutusbot', 'followsite.com', 'dataparksearch', 'google-sitemaps', 'appEngine-google', 'feedfetcher-google', 'liveinternet.ru', 'xml-sitemaps.com', 'agama', 'metadatalabs.com', 'h1.hrn.ru', 'googlealert.com', 'seo-rus.com', 'yaDirectBot', 'yandeG', 'yandex', 'yandexSomething', 'Copyscape.com', 'AdsBot-Google', 'domaintools.com', 'Nigma.ru', 'bing.com', 'dotnetdotcom'); // Bot List
/* Checks
========================================================================== */
$redirect = true;
foreach($botList as $bot) {
	if(stripos($_SERVER['HTTP_USER_AGENT'], $bot) !== false){
		$redirect = false; // Don't redirect bots
	}
}
if (in_array($administrator, JAccess::getAuthorisedViewLevels(JFactory::getUser()->id)) ) {
	$redirect = false; // Don't redirect admin
}
if (empty($message)) {
	$message = $this->error->getCode().' - '.htmlspecialchars($this->error->getMessage(), ENT_QUOTES, 'UTF-8'); // Default Message
}
if (empty($url)) {
	$url = '/'; // Default redirect url
}
/* Result
========================================================================== */
if ($redirect) {
	JFactory::getApplication()->redirect($url = $url, $msg = $message, $msgType='error', $moved = true); // Redirect
}
require_once JPATH_THEMES.'/system/error.php'; // Show standart error page
?>
<?php
/**
 * @package    	Error page with visitor redirect (Multilanguage)
 * @version     1.0
 * @author      Igor Berdicheskiy - septdir.ru
 * @copyright   Copyright (c) 2013 - 2017 Igor Berdicheskiy. All rights reserved.
 * @license     GNU/GPL license: http://www.gnu.org/copyleft/gpl.html
 */
defined('_JEXEC') or die('Restricted access');
/* Settings
========================================================================== */
$url = array(); // Custom Redirect pages
$url['en-GB'] = '/en'; // English Redirect page
$url['ru-RU'] = '/ru'; // Russian Redirect page
$message = ''; // Custom Message
$administrator = 3; // Administrator Access Level /administrator/index.php?option=com_users&view=levels
$botList = array('rambler', 'googlebot', 'aport', 'yahoo', 'msnbot', 'turtle', 'mail.ru', 'omsktele', 'yetibot', 'picsearch', 'sape.bot', 'sape_context', 'gigabot', 'snapbot', 'alexa.com', 'megadownload.net', 'askpeter.info', 'igde.ru', 'ask.com', 'qwartabot', 'yanga.co.uk', 'scoutjet', 'similarpages', 'oozbot', 'shrinktheweb.com', 'aboutusbot', 'followsite.com', 'dataparksearch', 'google-sitemaps', 'appEngine-google', 'feedfetcher-google', 'liveinternet.ru', 'xml-sitemaps.com', 'agama', 'metadatalabs.com', 'h1.hrn.ru', 'googlealert.com', 'seo-rus.com', 'yaDirectBot', 'yandeG', 'yandex', 'yandexSomething', 'Copyscape.com', 'AdsBot-Google', 'domaintools.com', 'Nigma.ru', 'bing.com', 'dotnetdotcom'); // Bot List
/* Checks
========================================================================== */
$redirect = true;
foreach($botList as $bot) {
	if(stripos($_SERVER['HTTP_USER_AGENT'], $bot) !== false){
		$redirect = false; // Don't redirect bots
	}
}
if (in_array($administrator, JAccess::getAuthorisedViewLevels(JFactory::getUser()->id)) ) {
	$redirect = false; // Don't redirect admin
}
if (empty($message)) {
	$message = $this->error->getCode().' - '.htmlspecialchars($this->error->getMessage(), ENT_QUOTES, 'UTF-8'); // Default Message
}
if (count($url) > 0) {
	if (isset($url[JFactory::getLanguage()->getTag()])) {
		$url = $url[JFactory::getLanguage()->getTag()];
	}
	else {
		$url = '/'; // Default redirect url
	}
}
else {
	$url = '/'; // Default redirect url
}
/* Result
========================================================================== */
if ($redirect) {
	JFactory::getApplication()->redirect($url = $url, $msg = $message, $msgType='error', $moved = true); // Redirect
}
require_once JPATH_THEMES.'/system/error.php'; // Show standart error page
?>