Закрытие/редирект внешних ссылок
Автор модификации kerk. [
тема автора]
Работает на 3.8.4.
Текст автора: Сразу предупреждаю, редактирование исходного файла! (для себя уже решил, что дальше третьей линейки обновлять форум не собираюсь) поэтому те, кого в принципе не интересуют хаки с редактированием исходных файлов движка, могут дальше не читать.
=========
Установка затрагивает:
1. редактирование одного файла
2. добавление одной настройки в админке
3. добавление небольшого яваскрипта в в шаблон
=========
1. Редактируем файл includes/
class_bbcode.php ищем там функцию
function handle_bbcode_url($text, $link). Весь код функции заменяем новым:
PHP код:
function handle_bbcode_url($text, $link)
{
$rightlink = trim($link);
if (empty($rightlink))
{
// no option -- use param
$rightlink = trim($text);
}
$rightlink = str_replace(array('`', '"', "'", '['), array('`', '"', ''', '['), $this->strip_smilies($rightlink));
// remove double spaces -- fixes issues with wordwrap
$rightlink = str_replace(' ', '', $rightlink);
if (!preg_match('#^[a-z0-9]+(?<!about|javascript|vbscript|data):#si', $rightlink))
{
$rightlink = "http://$rightlink";
}
if (!trim($link) OR str_replace(' ', '', $text) == $rightlink)
{
$tmp = unhtmlspecialchars($rightlink);
if (vbstrlen($tmp) > 55 AND $this->is_wysiwyg() == false)
{
$text = htmlspecialchars_uni(vbchop($tmp, 36) . '...' . substr($tmp, -14));
}
else
{
// under the 55 chars length, don't wordwrap this
$text = str_replace(' ', '', $text);
}
}
static $current_url, $current_host, $allowed;
$is_external = true;
if (!isset($current_url))
{
$current_url = @parse_url($this->registry->options['bburl']);
$current_host = preg_replace('#:(\d)+$#', '', $current_url['host']);
$allowed = preg_split('#\s+#', $this->registry->options['url_external_whitelist'], -1, PREG_SPLIT_NO_EMPTY);
$allowed[] = preg_replace('#^www\.#i', '', $current_host);
$allowed[] = preg_replace('#^www\.#i', '', $current_url['host']);
}
$target_url = preg_replace('#^([a-z0-9]+:(//)?)#', '', $rightlink);
foreach ($allowed AS $host)
{
if (stripos($target_url, $host) !== false)
{
$is_external = false;
}
}
// standard URL hyperlink
if(!$is_external)
{
return "<a href=\"$rightlink\" target=\"_blank\">$text</a>";
}else{
$uniqid = substr(md5(uniqid(rand(), true)), 0, 10);
return "<span id=\"extlink_" . $uniqid . "\" title=\"External Link, no Referer ".$rightlink."\" style=\"text-decoration:underline; cursor: pointer;\" onclick=\"return open_external('$rightlink', this.id);\">$text</span>";
}
}
2. Устанавливаем хак от kerk'a под названием
Debug Mode From AdminCP (режим отладки). Включаем его для админ. панели.
3. Идем: Админка => Основные настройки => Настройки ББ кодов => [Добавить настройку]. Заполняем формку данными:
Имя переменной: url_external_whitelist
Настройки группы: Настройки ББ кодов
Продукт: vBulletin
Заголовок: Белый список доменов
Описание:
В этом пункте вы можете указать домены, которые не будут открываться яваскриптом.<br />
Разделяйте домены переводом строки, и <b>не</b> указывайте http://<br />
пример: vbhelp.org
Коды опций: textarea
По умолчанию: _оставляем_поле_пустым_
Тип для проверки данных: Free
Все остальное оставляем как есть
4. Открываем шаблон
headinclude во всех стилях и в самый низ добавляем код яваскрипта:
PHP код:
<script type="text/javascript">
<!--
function open_external(url, id)
{
w = window.open('about:blank', id);
w.document.write('<meta http-equiv="refresh" content="0;url='+url+'">');
w.document.close();
return false;
}
-->
</script>
Сохраняем изменения и радуемся. Редиректы будут работать только для новых сообщений. Для того чтобы ссылки на форуме поменялись нужно сделать в базу запрос:
PHP код:
TRUNCATE TABLE postparsed
если есть префикс у таблиц, его нужно добавить к
postparsed, пример:
префикс: vb_
выполняем запрос:
PHP код:
TRUNCATE TABLE vb_postparsed
В виде хака для линейки 3.8.х:
kr_external_links.rar