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

Н

Ночная странница

#1
Наверное, вы обратили внимание, как на этом форуме выглядят все внешние ссылки? При наведении на них мышкой появляется надпись "Внешняя ссылка, реферер не передается..." Эта темка посвящена тому, как сделать то же самое у вас на форуме.
Поисковики перестанут видеть внешние ссылки, для них это будет просто тег <span>

Примечание: требуется редактирование исходных файлов движка.

Порядок действий:
1) Скачиваем хак.
2) Редактируем на сервере файл includes/class_bbcode.php, на всякий случай предварительно сохранив исходную (неизменённую) копию. Текст замены одной из функций (а не всего файла, обратите внимание!) приведен в файле external_links данного архива.
3) Импортируем продукт в нужной кодировке.
4) В шаблоне headinclude нужного стиля в самом низу добавляем скрипт:

Код:
<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>

5) Смотрим на форуме - изменились внешние ссылки или нет. Если нет, то переходим в phpmyAdmin и выполняем запрос к базе данных:

Код:
TRUNCATE TABLE postparsed

Если у вашей базы данных есть префикс у таблиц (можно посмотреть в списке таблиц) то добавляем его перед названием данной таблицы:

Код:
TRUNCATE TABLE префикс_postparsed

После этого убедимся, что запрос выполнен (об этом будет сообщение SQL-запрос был успешно выполнен) и любуемся на новый вид внешних ссылок.
(Если и это не помогло, в админке - "обслуживание" перестраиваем кеш сообщений).

Настройки продукта находятся в настройках bb-кодов, и там, собственно, всего один пункт: В этом пункте вы можете указать домены, которые не будут открываться яваскриптом. По умолчанию в форме указаны сайты техподдержки.

Обратите внимание: хак работает только со ссылками, заключенными в тег bb-кода URL, включите в настройках пункт "Автоматически вставлять ссылки".
Примечание: браузер Опера реферер всё же передает.
Проверила данный хак на своём форуме - работает.
 
W

Wmboard

#2
Добавлю, что требуется редактирование исходных файлов движка. Если будете менять линейку, или обновлять версию, то работать перестанет.
Ну и разработчик Kerk с vbsupport.org
 
А

Аркадий 10

#3
Спасибо. Ссылки стали черного, а не синего цвета при наводе на них курсора выскакивает сообщение:
"Внешняя ссылка, реферер не передается."
Как понимаю выполнил рекомендации правильно? :) Еще раз спасибо.
 
D

Dmi Try

#5
Всё установил по инструкции. Ссылки все изменились как и положено. Но при нажатии на ссылку она не открывается. Помогите.
 
W

Wmboard

#6
А что происходит при нажатии на ссылку?
 
W

Wmboard

#8
Проверьте еще раз все ли точно вы выполнили по инструкции, затем сделайте запрос к БД, что в инструкции, и попробуйте очистить кэш и перестроить информацию о темах в админке.
 
D

Dmi Try

#9
Да я уже раз пять проверял. Ничего. Когда наводишь курсор, то вылазит это "Внешняя ссылка, реферер не передается." А при нажатии ничего. Может проблема с ява-скриптом?
 
W

Wmboard

#10
Кэш очищали? Информацию о темах перестраивали? Дайте ссылку посмотреть.
 
D

Dmi Try

#13
Там я уже всё перепробовал.
 
W

Wmboard

#14
Ну значит начинайте сначала:

редактируем файл includes/class_bbcode.php
ищем там функцию function handle_bbcode_url($text, $link)

Функцию правильно нашли? Исходный файл сохранили я надеюсь? Открываете заново исходник, ищете:

Код:
 function handle_bbcode_url($text, $link)	{	$rightlink = trim($link);	if (empty($rightlink))	{	$rightlink = trim($text);	}	$rightlink = str_replace(array('`', '"', "'", '['), array('`', '"', ''', '['), $this->strip_smilies($rightlink));	$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	{	$text = str_replace(' ', '', $text);	}	}	return "<a href=\"$rightlink\" target=\"_blank\">$text</a>";	}

Меняете на:

Код:
 function handle_bbcode_url($text, $link) { $rightlink = trim($link); if (empty($rightlink)) { $rightlink = trim($text); } $rightlink = str_replace(array('`', '"', "'", '['), array('`', '"', ''', '['), $this->strip_smilies($rightlink)); $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 { $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['kr_external_links_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; } } if(!$is_external) { return "<a href=\"$rightlink\" target=\"_blank\">$text</a>"; }else{ global $vbphrase; $phrase_noref = construct_phrase($vbphrase['kr_external_links'], $rightlink); $uniqid = substr(md5(uniqid(rand(), true)), 0, 10); return "<span id=\"extlink_" . $uniqid . "\" title=\"" . $phrase_noref . "\" style=\"text-decoration:underline; cursor: pointer;\" onclick=\"return open_external('$rightlink', this.id);\">$text</span>"; } }

Могли вполне заменить или часть кода, или другой код...

Продукт импортировали?

В шаблон headinclude код добавили в самый низ?

Код:
<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>
 
D

Dmi Try

#15
Всё именно так и делал. А вот это что означает? внизу фотографии.
 
D

Dmi Try

#17
Спасибо разобрался.)) Я этот скрипт всунул в headinclude основного стиля, а нужно было в обычный стиль.
 
W

Wmboard

#18
Ну бывает... самая главная ошибка у всех это невнимательность :)
 
W

Wmboard

#21
Продукт в первом посте темы. Во вложении.
Порядок установки также описан в первом посте.

Откуда и куда его импортировать?
Админка, продукты и модули, управление продуктами, Добавить/импортировать продукт



Шаблон headinclude где расположен?
Админка, стили и шаблоны, управление стилями, редактировать шаблоны, в списке находите нужный.


Автоспец, изучайте админку. VB очень мощный движок, но вполне доступный и логичный.
 
Д

джинася

#22
Ничего у меня не получается! :wall::mad1:
Как исправляю

includes/class_bbcode.php,
так у меня не загружаются темы.

Вот как в документе:
* @return string HTML representation of the tag.
*/
function handle_bbcode_url($text, $link)
{
$rightlink = trim($link);
if (empty($rightlink))
{
$rightlink = trim($text);
}
$rightlink = str_replace(array('`', '"', "'", '['), array('`', '"', ''', '['), $this->strip_smilies($rightlink));

$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
{
$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['kr_external_links_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;
}
}
if(!$is_external)
{
return "<a href=\"$rightlink\" target=\"_blank\">$text</a>";
}else{
global $vbphrase;
$phrase_noref = construct_phrase($vbphrase['kr_external_links'], $rightlink);
$uniqid = substr(md5(uniqid(rand(), true)), 0, 10);
return "<span id=\"extlink_" . $uniqid . "\" title=\"" . $phrase_noref . "\" style=\"text-decoration:underline; cursor: pointer;\" onclick=\"return open_external('$rightlink', this.id);\">$text</span>";
}

Добавлено через 34 секунды
Ой,смайлики...:pardon:
 
W

Wmboard

#23
Скачайте ваш файл class_bbcode.php, запакуйте и выложите здесь. Исходник разумеется.
 
Д

джинася

#24
Пардон,только детей уложила. :blush:
 
W

Wmboard

#25
Пробуйте земенить ваш файл вот этим.
Исходник сохраните естественно.
 
Д

джинася

#26
Пробуйте земенить ваш файл вот этим.
Исходник сохраните естественно.
Заменила. Темы открываются.
Но ссылки не изменились.
Вот это надо теперь сделать:
5) Смотрим на форуме - изменились внешние ссылки или нет. Если нет, то переходим в phpmyAdmin и выполняем запрос к базе данных:
На хостинге?
 
W

Wmboard

#27
Продукт импортировали?
В шалон headinclude вашего стиля вставили скрипт?
Очистите кэш.

В БД обычно не требуется лезть
 
W

Wmboard

#29
Ну попробуйте ответить там в какой-нибудь теме со ссылкой. Посмотрите эффект.
 
W

Wmboard

#31
Дайте ссылку на страницу
 
W

Wmboard

#33
Вы наверное продукт не в той кодировке поставили...
 
Д

джинася

#34
W

Wmboard

#35
Ну если новые как нужно, тогда все в порядке с хаком.
А вот если старые крокозябрами, то наверное у вас тоже проблемы с кодировкой БД...
 
W

Wmboard

#37
Ну тогда на старых может быть кэш, если вы пробовали ставить хак с разной кодировкой...
Думаю, что ничего страшного.
 
I

inso

#39
Поясните новичку пожалуйста, я правильно понимаю, что если поставлю этот хак, то поисковики меня не накажут за неактуальные или левые ссылки, размещенные пользователями на форуме?
 
W

Wmboard

#40
Да, они не будут внешними ссылками для ПС.
 
I

inso

#41
Спасибо пользуясь инструкцией и комментариями в теме, установил хак. Поначалу ничего не изменилось, но перечитав тему, попробовал написать сообщение и выложил новую ссылку. Хак заработал.
 
А

Автоспец

#42
Здравствуйте. Посоветуйте пожалуйста, как закрыть от индексации ссылки и картинки с др сайтов. Хак не предлагать - я его прикрутить не могу (раз 5 пробовал:(). Может какой скрипт поставить? Мне нужно только форум закрыть от индесации ссылок, а не весь сайт целиком. Будет ли картинка, загруженная с др. сайта, считаться ссылкой и передавать вес?
 
W

Wmboard

#43
Будет ли картинка, загруженная с др. сайта, считаться ссылкой и передавать вес?

Если речь о тэге IMG, то нет.

Хак не предлагать - я его прикрутить не могу (раз 5 пробовал)
Речь об этом хаке? Хм... а что там сложного?

Есть еще хак https://lumtu.com/haki-vbulletin/2499-hak-skrytiya-ssylok-ot-gostei-hide-links-guest.html
 
I

inso

#44
Хак закрывает как внешние ссылки, так и внутренние. У вас на форуме я вижу, что внутренние не закрыты. Это полезно для ПС, когда внутренние ссылки не закрыты? Кстати как сделать, чтобы когда вставляешь внутреннюю ссылку на другую тему, она отображалась названием той темы (как здесь)?
 
W

Wmboard

#45
Хак закрывает как внешние ссылки, так и внутренние.

Кто это вам сказал? :shok:
Хак НЕ закрывает внутренние.

Это полезно для ПС, когда внутренние ссылки не закрыты?
Разумеется. Внутренние закрывать не нужно. Вернее нужно их часть, которая вредна (дубли текста) или мусорный материал.


Здесь vbSEO
 
I

inso

#46
Кто это вам сказал?
Хак НЕ закрывает внутренние.
Блин у меня навожу на ссылку на другую тему и надпись вылазит "внешняя ссылка реферер не передается". Видимо из-за домена .рф такая хрень(((
 
I

inso

#48
Блин у меня навожу на ссылку на другую тему и надпись вылазит "внешняя ссылка реферер не передается". Видимо из-за домена .рф такая хрень(((
Разобрался. Когда копируешь ссылку, а потом вставляешь - то она выглядит так http: //xn---dkjfgajgjagjoisjg--p2hg/showthread.....
Я вместо этой аброкадабры правил на мой-сайт.рф, чтобы выглядело так: http: //мой-сайт.рф/showthread.... Ибо это тоже самое но выглядит нормально, а не так, как будто ссылка на какой то левый сайт с вирусами и еще хз чем. Ну и после правки он уже воспринимает ее как внешнюю.

Пока оставлю аброкадаброй тогда, потом попробую vbseo поставить. В таком виде оставлять нельзя, ссылок таких люди просто пугаться будут - подумают спам.
 
W

Wmboard

#49
inso, vbSEO не исправит ситуацию с доменом РФ.
 
I

inso

#50
inso, vbSEO не исправит ситуацию с доменом РФ.

Я так понял, что там можно настроить, чтобы вместо ссылки показывалось название темы. Это уже лучше чем ничего. Вместо аброкадабры будет название темы как здесь. Или я понял неправильно?
 
Get involved!

Here you can only see a limited number of comments. On СЕО Форум Вебмастеров you see all comments and all functions are available to you. To the thread