Как очевидно, сообщение форума может содержать ссылки на страницы того же сайта, где находится форум. Вроде бы ничего криминального в этом нет, но... если использовать стандатный интерфейс для добавления ссылки в текст сообщения, html-код такой ссылки в итоге будет выглядеть примерно так (исходим из того, что хост текущего сайта — www.site.ru):
Минусы: 1. Абсолютная ссылка на внутреннюю страницу сайта вместо относительной. 2. target="_blank" на внутреннюю страницу сайта как правило не требуется. 3. rel="nofollow" на внутреннюю страницу как минимум не имеет смысла, а как максимум может наносить вред, хотя точно не знаю: я не SEOшник. В любом случае в данной ситуации лучше обойтись без таких выкрутасов. Стоит отметить, что rel="nofollow" добавляется в ссылку только, если в "Пользовательских настройках" модуля "Форум" (административная часть) стоит чекбокс напротив параметра "Добавлять к ссылкам rel='nofollow'".
Как же быть? Я нашел выход, правда, он предполагает модификацию php-кода одного из файлов, который отвечает за функционирование модуля "Форум", то есть проживет до первого обновления модифицируемого файла, но пока меня устроит и этот вариант. Главное условие, чтобы параметр "SERVER_NAME" ("URL сервера (без http://):" текущего сайта был равен текущему хосту, но как правило так и есть.
Проблема решается модификацией функции convert_anchor_tag() в файле /bitrix/modules/forum/classes/general/functions.php
Мое внедрение начинается с // my begin и заканчивается // my end
Комментирование кода, который я заменяю, начинается с // my comment begin и заканчивается // my comment end
Теперь страница темы форума после сохранения будет содержать ссылку с несколько другим, можно даже сказать, абсолютно адекватным html-кодом:
<a href="/test.php">ссылка</a>
Если у кого-то есть идеи, как это реализовать еще лучше, буду рад выслушать. Возможно, кому-то это изменение покажется пустячным. Соглашусь, но надеюсь, что в нем есть смысл хотя бы с точки зрения SEO. P. S. Отправил запрос в техподдержку на включение данного или такого же по смыслу изменения в вышеуказанный файл модуля "Форум".
Как вариант может быть по событию в эпилоге регуляркой искать в содержимом буфера url и заменять http://www.sitename.ru/ на /. Атрибуты target и rel можно аналогичным образом обработать. Метод тупой до безумия, но по крайне мере не лезем в файлы битрикса. Таким способом раньше (да и сейчас тоже) ЧПУ делают.
ОК, вот вам вариант. Само собой, правим уже /bitrix/php_interface/init.php
AddEventHandler("main", "OnEndBufferContent", "ChangeMyContent");
function ChangeMyContent($content)
{
// создаем объект
$obCache = new CPHPCache;
// время кеширования - 24 часа
$life_time = 1440*60;
// формируем идентификатор кеша в зависимости от всех параметров
// которые могут повлиять на результат
$cache_id = SITE_ID.'SERVER_NAME'.'my';
// если кеш есть и он ещё не истек, то
if($obCache->InitCache($life_time, $cache_id, '/'))
{
//echo 'CACHED';
// получаем закешированные переменные
$vars = $obCache->GetVars();
$arSite = $vars["arSite"];
}
else
{
//echo 'NEW';
// иначе обращаемся к базе
$rsSites = CSite::GetByID(SITE_ID);
$arSite = $rsSites->Fetch();
$arSite["SERVER_NAME"] = str_replace('www.', '', $arSite["SERVER_NAME"]);
}
// выполняем регулярное выражение
$pattern = '/<a href=\"http:\/\/(www.)?'.$arSite["SERVER_NAME"].'([\w_\/#]+)\"( target=\"_blank\" rel=\"nofollow\")?>/i';
$replacement = '<a href="$2">';
$content = preg_replace($pattern, $replacement, $content);
// начинаем буферизирование вывода
if($obCache->StartDataCache())
{
$obCache->EndDataCache(
array("arSite" => $arSite)
);
}
}
Плюсы: 1. Никакой правки ядра. 2. Применяется на всех страницах сайта, не только в форуме. 3. Используется кеширование запроса к базе (ну это так, заодно). 4. Используется событие OnEndBufferContent(), которое вызывается непосредственно перед отображением страницы. Минусы: 1. Регулярное выражение.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».