Next Generation CMS :: Форум поддержки

Заинтересовала наша система? Тогда этот форум для Вас!

Вы не зашли.

#1 2017-03-04 11:48:09

UriyZenkov
Участник
Зарегистрирован: 2011-01-13
Сообщений: 276
Рейтинг :   
Сайт

Продажа ссылок на fluxbb

Хак для скрытия всех внешних ссылок через редирект на Fluxbb
(с возможностью оставить открытой любую необходимую ссылку)

Когда хак будет настроен, все внешние ссылки с сайта, включая ссылки в бб-кодах url, в описаниях профилей и на страницах профилей, будут работать редиректом через файл go.php
Таким образом все внешние ссылки будут иметь следующий вид:

http://site.ru/go.php?to=http://yandex.ru

Затем данный файл для надежности закрывается от индексации в robots.txt с помощью такой директивы:

Disallow: go.php

Чтобы иметь возможность оставлять некоторые ссылки открытыми, мы добавим на форум дополнительный бб-код [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:// - она не будет работать, потому что мы удалили код, отвечающий за преобразование неправильных ссылок без протокола к виду с протоколом: http://site.ru
Зато сэкономили немного серверных ресурсов на будущее.


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) Осталось дело за малым. Помимо текстов постов, нам надо закрыть ещё и ссылки в описаниях профилей и на страницах профилей.
а) Чтобы такие ссылки в описаниях профилей тоже работали через редирект:
9ybnz474gbpret6ojfer89v3w.jpg
Открываем файл /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:
https://linexp.ru/messageboards/fluxbb.html
https://fluxbb.qb7.ru/forum/viewtopic.php?id=3956

Сделал фрилансер Wondersmith

Я потратился на этот код, в знак благодарности можете зарегистрироваться по моей партнёрской ссылке на linkum.ru

Рекламные ссылки с форумов

Изменено UriyZenkov (2022-06-28 22:13:06)

Не в сети

#2 2017-03-04 14:04:15

irbees2008
Продвинутый чайник ;)
Откуда Шахтинск
Зарегистрирован: 2012-03-14
Сообщений: 2,873
Рейтинг :   121 
Сайт

Re: Продажа ссылок на fluxbb

Красота, но в вроде здесь в форуме почти такое же встроенно wink

Не в сети

#3 2017-03-04 20:57:27

UriyZenkov
Участник
Зарегистрирован: 2011-01-13
Сообщений: 276
Рейтинг :   
Сайт

Re: Продажа ссылок на fluxbb

irbees2008 пишет:

Красота, но в вроде здесь в форуме почти такое же встроенно wink

рекламки я видел только в футере, а тэг [rurl] можно вставлять в посты и подписи

Не в сети

Подвал раздела

Работает на FluxBB