Хак для скрытия всех внешних ссылок через редирект на Fluxbb
(с возможностью оставить открытой любую необходимую ссылку)
Когда хак будет настроен, все внешние ссылки с сайта, включая ссылки в бб-кодах url, в описаниях профилей и на страницах профилей, будут работать редиректом через файл go.php
Таким образом все внешние ссылки будут иметь следующий вид:
Код:
http://site.ru/go.php?to=http://yandex.ru
Затем данный файл для надежности закрывается от индексации в robots.txt с помощью такой директивы:
Чтобы иметь возможность оставлять некоторые ссылки открытыми, мы добавим на форум дополнительный бб-код [rurl]. Далее в инструкции в коде в качестве бб-кода будет использоваться rurl, но вы можете использовать любой другой (скажем [refurl231], чтобы защитить свой форум от спамеров, которые возможно набредут на инструкцию по этому хаку. Это маловероятно, но всё же.
Инструкция для Fluxbb 1.5.10:
1) Создаем в корне форума файл с названием go.php и таким содержанием:
Код:
<?php
$to_link = $_GET["to"];
$URL = substr_replace($URL, $to_link, 0);
header ("Location: $URL");
?>
2) Находим в файле /includes/parser.php функцию handle_url_tag, в которой нас интересует вот эта часть:
Код:
return '<a href="'.$full_url.'" rel="nofollow">'.$link.'</a>';
Заменяем её на это, изменив site.ru на ваш домен:
Код:
return '<a href="http://site.ru/go.php?to='.$full_url.'" rel="nofollow">'.$link.'</a>';
Теперь все ссылки в бб-коде url будут идти редиректом через go.php
3) Чтобы иметь возможность оставлять некоторые ссылки прямыми, без редиректов и rel=nofollow, нам нужна точно такая же функция, но которая будет обрабатывать ссылки, скажем, в бб-коде [rurl] и выдавать их напрямую, без подстановки go.php.
Для этого мы полностью копируем функцию handle_url_tag, переименовываем её в handle_rurl_tag, приводим строчку return к такому виду:
Код:
return '<a href="'.$full_url.'">'.$link.'</a>';
А также находим вот этот кусок кода:
Код:
if ($bbcode)
{
if ($full_url == $link)
return '[url]'.$link.'[/url]';
else
return '[url=.$full_url.]'.$link.'[/url]';
}
И заменяем в нём все url, на rurl. Получится вот так:
Код:
if ($bbcode)
{
if ($full_url == $link)
return '[rurl]'.$link.'[/rurl]';
else
return '[rurl='.$full_url.']'.$link.'[/rurl]';
}
Вы могли заметить, что помимо отсутствия go.php мы также убрали и rel="nofollow".
Напоминаю, что если вы хотите получить в итоге не [rurl] бб-код для открытых ссылок, а какой-то другой, то начиная с этого момента и далее все rurl вам надо заменять на свой вариант.
В итоге у вас должна получиться вот такая картина:
Код:
function handle_rurl_tag($url, $link = '', $bbcode = false)
{
$url = pun_trim($url);
// Deal with [url][img]http://example.com/test.png[/img][/url]
if (preg_match('%<img src=\"(.*?)\"%', $url, $matches))
return handle_url_tag($matches[1], $url, $bbcode);
$full_url = str_replace(array(' ', '\'', '`', '"'), array('%20', '', '', ''), $url);
if (!preg_match('#^([a-z0-9]{3,6})://#', $url)) // Else if it doesn't start with abcdef://, we add http://
$full_url = 'http://'.$full_url;
// Ok, not very pretty :-)
if ($bbcode)
{
if ($full_url == $link)
return '[rurl]'.$link.'[/rurl]';
else
return '[rurl='.$full_url.']'.$link.'[/rurl]';
}
else
{
if ($link == '' || $link == $url)
{
$url = pun_htmlspecialchars_decode($url);
$link = utf8_strlen($url) > 55 ? utf8_substr($url, 0 , 39).' … '.utf8_substr($url, -10) : $url;
$link = pun_htmlspecialchars($link);
}
else
$link = stripslashes($link);
return '<a href="'.$full_url.'">'.$link.'</a>';
}
}
Не забываем про замену site.ru на ваш домен.
Необязательное улучшение
Хотите немного сэкономить ресурсы сервера? Для этого можно удалить лишние обработчики неправильного написания ссылок в нашей новой функции.
Убираем из handle_rurl_tag данный кусок кода:
Код:
if (strpos($url, 'www.') === 0) // If it starts with www, we add http://
$full_url = 'http://'.$full_url;
else if (strpos($url, 'ftp.') === 0) // Else if it starts with ftp, we add ftp://
$full_url = 'ftp://'.$full_url;
else if (strpos($url, '/') === 0) // Allow for relative URLs that start with a slash
$full_url = get_base_url(true).$full_url;
и заменяем оставшуюсся
Код:
else if (!preg_match('#^([a-z0-9]{3,6})://#', $url)) // Else if it doesn't start with abcdef://, we add http://
$full_url = 'http://'.$full_url;
на
Код:
if (!preg_match('#^([a-z0-9]{3,6})://#', $url)) // Else if it doesn't start with abcdef://, we add http://
$full_url = 'http://'.$full_url;
В итоге наша функция handle_rurl_tag станет на несколько операций короче и будет выглядеть так:
Код:
function handle_rurl_tag($url, $link = '', $bbcode = false)
{
$url = pun_trim($url);
// Deal with [url][img]http://example.com/test.png[/img][/url]
if (preg_match('%<img src=\"(.*?)\"%', $url, $matches))
return handle_url_tag($matches[1], $url, $bbcode);
$full_url = str_replace(array(' ', '\'', '`', '"'), array('%20', '', '', ''), $url);
if (!preg_match('#^([a-z0-9]{3,6})://#', $url)) // Else if it doesn't start with abcdef://, we add http://
$full_url = 'http://'.$full_url;
// Ok, not very pretty :-)
if ($bbcode)
{
if ($full_url == $link)
return '[rurl]'.$link.'[/rurl]';
else
return '[rurl='.$full_url.']'.$link.'[/rurl]';
}
else
{
if ($link == '' || $link == $url)
{
$url = pun_htmlspecialchars_decode($url);
$link = utf8_strlen($url) > 55 ? utf8_substr($url, 0 , 39).' … '.utf8_substr($url, -10) : $url;
$link = pun_htmlspecialchars($link);
}
else
$link = stripslashes($link);
return '<a href="'.$full_url.'">'.$link.'</a>';
}
}
С такой функцией в тэгах [rurl] ссылки нужно будет обязательно прописывать с http:// в начале. Вот так:
Код:
[rurl=http://yandex.ru]анкор ссылки[/rurl]
Если указать ссылку без http:// - она не будет работать, потому что мы удалили код, отвечающий за преобразование неправильных ссылок без протокола к виду с протоколом:
Для просмотра ссылки Войди или Зарегистрируйся
Зато сэкономили немного серверных ресурсов на будущее.
3) Теперь нам надо связать новую функцию handle_rurl_tag с, собственно, бб-кодом rurl, который нам кстати тоже сперва надо добавить.
Для этого находим в файле /includes/parser.php функцию
do_bbcode, а в ней такие строки:
Код:
$pattern_callback[] = '%\[url\]([^\[]*?)\[/url\]%';
$pattern_callback[] = '%\[url=([^\[]+?)\](.*?)\[/url\]%';
Делаем дубль этих двух строк.
Меняем в дублированных строках url на rurl или ваш бб-код.
В итоге получаем такой код:
Код:
$pattern_callback[] = '%\[url\]([^\[]*?)\[/url\]%';
$pattern_callback[] = '%\[url=([^\[]+?)\](.*?)\[/url\]%';
$pattern_callback[] = '%\[rurl\]([^\[]*?)\[/rurl\]%';
$pattern_callback[] = '%\[rurl=([^\[]+?)\](.*?)\[/rurl\]%';
Далее опускаемся ниже и находим такие строки:
Код:
$replace_callback[] = 'handle_url_tag($matches[1])';
$replace_callback[] = 'handle_url_tag($matches[1], $matches[2])';
Поясню подробнее. Данные строки отвечают за то, чтобы бб-код url обрабатывался функцией handle_url_tag.
Наша задача теперь привязать только что созданный [rurl] бб-код к новой функции handle_rurl_tag.
Для этого мы также делаем дубль этих двух строк и заменяем в них handle_url_tag на handle_rurl_tag.
В итоге у нас получится вот это:
Код:
$replace_callback[] = 'handle_url_tag($matches[1])';
$replace_callback[] = 'handle_url_tag($matches[1], $matches[2])';
$replace_callback[] = 'handle_rurl_tag($matches[1])';
$replace_callback[] = 'handle_rurl_tag($matches[1], $matches[2])';
Сохраняем файл на сервере вместо стандартного, заходим на форум и создаём пост с двумя ссылками:
Одну через url бб-код, другую через rurl бб-код. Если вы всё сделали правильно, то обычная ссылка будет идти через редирект, а rurl-ссылка будет прямой и без атрибута rel="nofollow".
4) Осталось дело за малым. Помимо текстов постов, нам надо закрыть ещё и ссылки в описаниях профилей и на страницах профилей.
а) Чтобы такие ссылки в описаниях профилей тоже работали через редирект:
Открываем файл /viewtopic.php и заменяем вот эту строку:
Код:
$user_contacts[] = '<span class="website"><a href="'.pun_htmlspecialchars($cur_post['url']).'" rel="nofollow">'.$lang_topic['Website'].'</a></span>';
на это, заменив site.ru на свой домен:
Код:
$user_contacts[] = '<span class="website"><a href="http://site.ru/go.php?to='.pun_htmlspecialchars($cur_post['url']).'" rel="nofollow">'.$lang_topic['Website'].'</a></span>';
б) Чтобы редиректить ссылки со страниц профилей, открываем файл /profile.php и аналогичным образом заменяем это:
Код:
$user_personal[] = '<dd><span class="website"><a href="'.$user['url'].'" rel="nofollow">'.$user['url'].'</a></span></dd>';
на это, заменив site.ru на свой домен:
Код:
$user_personal[] = '<dd><span class="website"><a href="http://site.ru/go.php?to='.$user['url'].'" rel="nofollow">'.$user['url'].'</a></span></dd>';
Инструкция для Fluxbb 1.4
В файле include/parser.php также дублируем функцию function handle_url_tag
и меняем
Код:
{
if ($full_url == $link)
return '[url]'.$link.'[/url]';
else
return '[url=.$full_url.]'.$link.'[/url]';
}
на
Код:
{
if ($full_url == $link)
return '[rurl]'.$link.'[/rurl]';
else
return '[rurl='.$full_url.']'.$link.'[/rurl]';
}
Добавляем бб-тэг rurl и связываем его с нашей новой функцией. Для этого находим в файле include/parser.php такие строчки:
Код:
$pattern[] = '#\[url\]([^\[]*?)\[/url\]#e';
$pattern[] = '#\[url=([^\[]+?)\](.*?)\[/url\]#e';
Дублируем их и в продублированных строчках заменяем url на rurl
Далее находим строки:
Код:
$replace[] = 'handle_url_tag(\'$1\')';
$replace[] = 'handle_url_tag(\'$1\', \'$2\')';
Дублируем их и также заменяем url на rurl
Примеры include/parser.php:
Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
Сделал фрилансер
Для просмотра ссылки Войди или Зарегистрируйся
Я потратился на этот код, в знак благодарности можете зарегистрироваться по моей партнёрской ссылке на linkum.ru
Для просмотра ссылки Войди или Зарегистрируйся