Показать сообщение отдельно
Старый 30.03.2010, 20:32 Вверх   #1
Коварный тип
 
Аватар для Serberg
Serberg вне форума
Доп. информация
Хорошо Закрытие/редирект внешних ссылок [by kerk]

Закрытие/редирект внешних ссылок

Автор модификации 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($tmp36) . '...' 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'], -1PREG_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)), 010);
              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(urlid)
{
     
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

Последний раз редактировалось Serberg; 24.08.2011 в 13:19..
  Ответить с цитированием
7 пользователя(ей) сказали cпасибо:
 
Время генерации страницы 0.10504 секунды с 10 запросами