а. С помощью файла robots.txt (как и для любого другого форума/сайта)
б. Добавить бота в адм. разделе и отключить права на просмотр/чтение форумов
Недостатки первого варианта в том, что боты могут игнорировать этот файл или директивы в нём и синтаксис этого файла не всем "понятен" даже с инструкциями, недостатки второго варианта в том, что ограничения распространяются сразу на всех ботов, т.е. мы либо ограничиваем доступ всем ботам, либо определяем как ботов только определённых из них, остальные боты будут иметь права гостей, далее мод который позволяет полностью запретить просмотр форума только определённым ботам(браузерам)
1. В phpmyadmin выполнить (если префикс таблиц не phpbb_ - заменить на свой):
Код: Выделить всё
ALTER TABLE `phpbb_bots` ADD `bot_banned` TINYINT( 1 ) UNSIGNED NOT NULL DEFAULT '0';
INSERT INTO `phpbb_config` (`config_name`, `config_value`, `is_dynamic`) VALUES ('bot_banned', '0', '0'), ('bot_banned_text', '', '0');
adm/style/acp_bots.html после
Код: Выделить всё
<dl>
<dt><label for="bot_ip">{L_BOT_IP}:</label><br /><span>{L_BOT_IP_EXPLAIN}</span></dt>
<dd><input name="bot_ip" type="text" id="bot_ip" value="{BOT_IP}" maxlength="255" /></dd>
</dl>
Код: Выделить всё
<dl>
<dt><label for="bot_banned">{L_BOT_BANNED}:</label></dt>
<dd><select id="bot_banned" name="bot_banned">{S_BANNED_OPTIONS}</select></dd>
</dl>
Код: Выделить всё
<th>{L_BOT_LAST_VISIT}</th>
<th colspan="3">{L_OPTIONS}</th>
<th>{L_MARK}</th>
Код: Выделить всё
<th>{L_BOT_BANNED} [<a title="{L_SELECT_ALL}" href="#" onclick="$('.bot_ban').val(1);">+</a>/<a title="{L_UNSELECT_ALL}" href="#" onclick="$('.bot_ban').val(0);">-</a>]</th>
Код: Выделить всё
<td style="text-align: center;"> <a href="{bots.U_EDIT}">{L_EDIT}</a> </td>
<td style="text-align: center;"> <a href="{bots.U_DELETE}">{L_DELETE}</a> </td>
<td style="text-align: center;"><input type="checkbox" class="radio" name="mark[]" value="{bots.BOT_ID}" /></td>
Код: Выделить всё
<td style="text-align: center;"><select name="bot_banned[{bots.BOT_ID}]" class="bot_ban"><option value="1"<!-- IF bots.BOT_BANNED --> selected="selected"<!-- ENDIF --> />{L_YES}</option><option value="0"<!-- IF not bots.BOT_BANNED --> selected="selected"<!-- ENDIF --> />{L_NO}</option></select></td>
Код: Выделить всё
'legend2' => 'ACP_LOAD_SETTINGS',
'load_birthdays' => array('lang' => 'YES_BIRTHDAYS', 'validate' => 'bool', 'type' => 'radio:yes_no', 'explain' => true),
Код: Выделить всё
'bot_banned' => array('lang' => 'BOT_BANNED', 'validate' => 'string', 'type' => 'text:1:1', 'explain' => true),
'bot_banned_text' => array('lang' => 'BOT_BANNED_TEXT', 'validate' => 'string', 'type' => 'textarea:5:3', 'explain' => true),
Код: Выделить всё
$action = request_var('action', '');
$submit = (isset($_POST['submit'])) ? true : false;
$mark = request_var('mark', array(0));
Код: Выделить всё
$bot_banned = request_var('bot_banned', array(0));
Код: Выделить всё
case 'delete':
if ($bot_id || sizeof($mark))
{
Код: Выделить всё
case 'bot_banned':
if (sizeof($bot_banned))
{
foreach($bot_banned as $k => $v)
{
$k=intval($k);
$v=$v ? 1 : 0;
$sql = 'UPDATE ' . BOTS_TABLE . "
SET bot_banned = '{$v}'
WHERE bot_id='{$k}'";
$db->sql_query($sql);
}
}
$cache->destroy('_bots');
break;
Код: Выделить всё
'bot_agent' => request_var('bot_agent', ''),
'bot_ip' => request_var('bot_ip', ''),
'bot_active' => request_var('bot_active', true),
Код: Выделить всё
'bot_banned' => request_var('bot_banned', false),
Код: Выделить всё
'user_id' => (int) $user_id,
'bot_name' => (string) $bot_row['bot_name'],
'bot_active' => (int) $bot_row['bot_active'],
Код: Выделить всё
'bot_banned' => (int) $bot_row['bot_banned'],
Код: Выделить всё
$sql = 'UPDATE ' . BOTS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', array(
'bot_name' => (string) $bot_row['bot_name'],
'bot_active' => (int) $bot_row['bot_active'],
Код: Выделить всё
'bot_banned' => (int) $bot_row['bot_banned'],
Код: Выделить всё
$_options = array('0' => 'NO', '1' => 'YES');
foreach ($_options as $value => $lang)
{
$selected = ($bot_row['bot_active'] == $value) ? ' selected="selected"' : '';
$s_active_options .= '<option value="' . $value . '"' . $selected . '>' . $user->lang[$lang] . '</option>';
}
Код: Выделить всё
$s_banned_options = '';
$_options = array('0' => 'NO', '1' => 'YES');
foreach ($_options as $value => $lang)
{
$selected = ($bot_row['bot_banned'] == $value) ? ' selected="selected"' : '';
$s_banned_options .= '<option value="' . $value . '"' . $selected . '>' . $user->lang[$lang] . '</option>';
}
Код: Выделить всё
'BOT_AGENT' => $bot_row['bot_agent'],
'S_EDIT_BOT' => true,
'S_ACTIVE_OPTIONS' => $s_active_options,
Код: Выделить всё
'S_BANNED_OPTIONS' => $s_banned_options,
Код: Выделить всё
$_options = array('activate' => 'BOT_ACTIVATE', 'deactivate' => 'BOT_DEACTIVATE', 'delete' => 'DELETE');
Код: Выделить всё
$_options = array('activate' => 'BOT_ACTIVATE', 'deactivate' => 'BOT_DEACTIVATE', 'delete' => 'DELETE', 'bot_banned' => 'BOT_BANNED');
Код: Выделить всё
$sql = 'SELECT b.bot_id, b.bot_name, b.bot_active, u.user_lastvisit
Код: Выделить всё
$sql = 'SELECT b.bot_id, b.bot_name, b.bot_active, b.bot_banned, u.user_lastvisit
Код: Выделить всё
'BOT_NAME' => $row['bot_name'],
'BOT_ID' => $row['bot_id'],
'LAST_VISIT' => ($row['user_lastvisit']) ? $user->format_date($row['user_lastvisit']) : $user->lang['BOT_NEVER'],
Код: Выделить всё
'BOT_BANNED' => $row['bot_banned'] ? true : false,
Код: Выделить всё
$sql = 'SELECT user_id, bot_agent, bot_ip
Код: Выделить всё
$sql = 'SELECT user_id, bot_agent, bot_ip, bot_banned, bot_id
Код: Выделить всё
$bots[] = $row;
Код: Выделить всё
$bots[$row['bot_id']] = $row;
Код: Выделить всё
function session_begin($update_session_page = true)
{
global $phpEx, $SID, $_SID, $_EXTRA_URL, $db, $config, $phpbb_root_path;
Код: Выделить всё
function session_begin($update_session_page = true)
{
global $phpEx, $SID, $_SID, $_EXTRA_URL, $db, $config, $phpbb_root_path, $cache;
Код: Выделить всё
* bot, act accordingly
*/
$bot = false;
Код: Выделить всё
$bot_id=0;
Код: Выделить всё
if ($row['bot_agent'] && preg_match('#' . str_replace('\*', '.*?', preg_quote($row['bot_agent'], '#')) . '#i', $this->browser))
{
$bot = $row['user_id'];
Код: Выделить всё
$bot_id=$row['bot_id'];
Код: Выделить всё
if (strpos($this->ip, $bot_ip) === 0)
{
$bot = (int) $row['user_id'];
Код: Выделить всё
$bot_id=$row['bot_id'];
Код: Выделить всё
// If our friend is a bot, we re-assign a previously assigned session
if ($this->data['is_bot'] && $bot == $this->data['user_id'] && $this->data['session_id'])
Код: Выделить всё
if($this->data['is_bot'] && $config['bot_banned'] && $bot_id && isset($active_bots[$bot_id]['bot_banned']) && $active_bots[$bot_id]['bot_banned'])
{
if(stristr($_SERVER['REQUEST_URI'], "ucp.{$phpEx}")===FALSE && $config['bot_banned']==1)
{
header("Location: ".append_sid("{$phpbb_root_path}ucp.{$phpEx}", 'mode=login'));
exit();
}
else if($config['bot_banned']==2)
{
//$db->sql_query('DELETE FROM ' . SESSIONS_TABLE . ' WHERE session_user_id = ' . $this->data['user_id']);
trigger_error($config['bot_banned_text'] ? $config['bot_banned_text'] : 'Sorry, this browser banned on forum.');
}
}
Код: Выделить всё
$this->data['is_bot'] = (!$this->data['is_registered'] && $this->data['user_id'] != ANONYMOUS) ? true : false;
$this->data['user_lang'] = basename($this->data['user_lang']);
Код: Выделить всё
if($config['bot_banned']==2)
{
$bot = false;
$bot_id=0;
$active_bots = $cache->obtain_bots();
foreach ($active_bots as $row)
{
if ($row['bot_agent'] && preg_match('#' . str_replace('\*', '.*?', preg_quote($row['bot_agent'], '#')) . '#i', $this->browser))
{
$bot = $row['user_id'];
$bot_id=$row['bot_id'];
}
// If ip is supplied, we will make sure the ip is matching too...
if ($row['bot_ip'] && ($bot || !$row['bot_agent']))
{
// Set bot to false, then we only have to set it to true if it is matching
$bot = false;
foreach (explode(',', $row['bot_ip']) as $bot_ip)
{
$bot_ip = trim($bot_ip);
if (!$bot_ip)
{
continue;
}
if (strpos($this->ip, $bot_ip) === 0)
{
$bot = (int) $row['user_id'];
$bot_id=$row['bot_id'];
break;
}
}
}
if ($bot)
{
break;
}
}
if($bot_id && isset($active_bots[$bot_id]['bot_banned']) && $active_bots[$bot_id]['bot_banned'])
{
//$db->sql_query('DELETE FROM ' . SESSIONS_TABLE . ' WHERE session_user_id = ' . $this->data['user_id']);
trigger_error($config['bot_banned_text'] ? $config['bot_banned_text'] : 'Sorry, this browser banned on forum.');
}
}
Код: Выделить всё
));
?>
Код: Выделить всё
'BOT_BANNED' => 'Бан ботов',
'BOT_BANNED_EXPLAIN' => 'Включить бан поисковых ботов на форуме, 0 - отключить, 1 - включить частично (если пользователь определён как бот, для доступа необходимо будет войти на форум под своей учётной записью), 2 - включить полностью (все страницы форума будут недоступны)',
'BOT_BANNED_TEXT' => 'Сообщение для забаненных ботов',
'BOT_BANNED_TEXT_EXPLAIN' => ' Если число в предыдущей опции равно 2 - отображать указанный текст сообщения для бота (по молчанию будет отображаться сообщение: <em>Sorry, this browser banned on forum.</em>)',
Код: Выделить всё
));
?>
Код: Выделить всё
'BOT_BANNED' => 'Запретить',
'SELECT_ALL' => 'Да',
'UNSELECT_ALL' => 'Нет',
4. Если число в опции Бан ботов равно 1 - при определении бота как забаненного необходима очистка всех сессий на форуме (адм. раздел - вкладка Общие - Очистить все сессии) иначе, бан будет действовать только после истечения срока действия текущей сессии
5. Как уже написано выше, можно банить не только ботов, но и определённые браузеры на форуме, процесс точно такой-же как и для ботов, нужно добавить в раздел Поисковые боты нужный браузер (его UserAgent) и отметить его как запрещённого.
--
Скриншоты:
Опции в адм. разделе
Редактирование/создание бота
Список ботов
Результат посещения