Drupal: прячем внешние ссылки на сайте от индексирования

Чем больше ссылок на ваш сайт, тем выше его индекс цитирования, и значит он более весом в глазах поисковых систем. В то же время показатели вашего сайта могут снижаться, если на нем размещены ссылки на другие сайты. Таким образом, внешние ссылки на другие сайты лучше прятать.

Следует только обязательно разделять внешние ссылки и внутренние. Последние – это ссылки на страницы вашего же сайта. То есть вы с одних страниц своего сайта ссылаетесь на другие. Таковые ссылки наоборот очень полезны для сайта и их трогать не стоит.

Для сайтов на движке Drupal есть вполне неплохой модуль — External Link Page, который позволяет автоматически преобразовывать ссылки в нодах. Есть версия для Drupal 7. По умолчанию модуль делает вместо обычных ссылок редиректы.

Допустим, была в публикации внешняя ссылка test.ru, стала ваш_сайт.ru/ext_link?url=test.ru

В принципе, как можно видеть, изначально поставленная цель в данном случае уже достигается, — была внешняя ссылка, стала внутренняя. Однако, я считаю, что прятать внешние ссылки следует лучше. Самый простой способ – это закодировать их.

К сожалению, автором модуль External Link Page обновляется редко. Да и вряд ли он захочет добавить в него кодирование ссылок. На просторах интернета нашелся немного модифицированный готовый вариант данного модуля, где были сделаны ровно два изменения. Во-первых, добавлено кодирование ссылок с использованием алгоритма MIME base64. Во-вторых, исправлена ошибка, из-за которой внутренние ссылки на сайте тоже обрабатывались вместе с внешними.

Я рекомендую использовать именно модифицированный вариант модуля (Модуль External Link Page Mod.). Далее опишу порядок его настройки и использования.

Устанавливаем модуль и идем в его настройки:

Настройки External Link Page для Drupal 7

По умолчанию модуль External Link Page не сразу перенаправляет пользователя по внешней ссылке, а делает это через промежуточную страницу. По-моему это очень плохая мысль! Нужно уважать своих читателей. Зачем же их каждый раз тыкать носом? В общем, чтобы такого не было, первый параметр «Задержка перенаправления» устанавливаем в 0.

Параметр «Ссылка страницы» задайте так, как больше вам нравится. Я предпочитаю «go»,  так как это коротко и ясно. Можете оставить по умолчанию — «ext_link». Также отметьте параметры «Новое окно» и «Не следовать». Что они делают, думаю, понятно и так из комментариев.

Сохраните настройки и перейдите в меню «Конфигурация» → «Форматы ввода».

Форматы ввода в Drupal 7

Здесь для нужных форматов ввода нужно задействовать автоматическую замену внешних ссылок. Можете проделать описанные далее операции для всех имеющихся у вас форматов ввода.

И так, во-первых, необходимо включить фильтр «Страница внешних ссылок». Во-вторых, нужно обязательно убедиться, чтобы данный фильтр в порядке фильтров находился после «Преобразовывать адреса в ссылки». После изменений не забудьте сохранить настройки.

Настройка формата ввода в Drupal 7

Практически все готово. Зайдите в меню «Пользователи» → «Права доступа» и установите для модуля External Link Page и в частности для Access the external link page возможность доступа для всех, в том числе для гостей. Последнее — перейдите в меню «Конфигурация» → «Производительность» и отчистите кэш. Теперь можно проверять свои страницы (ноды). Все внешние ссылки на них должны быть уже закодированы.

Небольшое дополнение

Сразу скажу, что эти действия НЕ обязательны. Скорее они для параноиков вроде меня. :)

Алгоритм кодирования MIME base64 – это хороший вариант, но его не составляет труда раскодировать. Причем я подозреваю, что это, возможно, уже умеют делать и поисковые системы. Можно осложнить им задачу. Смысл прост. После кодирования ссылки в код в определенное место (например, в начало строки) добавляется хотя бы один символ (цифра или буква). Полученный в итоге код становится некорректным и раскодировать его в таком виде правильно невозможно. Для своих целей, перед раскодировкой мы установленный символ удаляем и у нас все работает.

Реализация идеи проста. В модуле External Link Page нужно немного подправить два файла.

В файле ext_link_page.module найдите сроки:

function base64url_encode($data) {
return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

И добавьте любые символы таким образом:

function base64url_encode($data) {
return "q1".rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

В файле ext_link_page.page.inc найдите строки:

function base64url_decode($data) {
return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));
}

И добавьте одну дополнительную строчку:

function base64url_decode($data) {
$data = mb_substr($data, 2);
return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));
}

Готово. Чистите снова кэш сайта (как мы делали выше) и проверяйте результат.

Еще дополнение

Как выяснилось сегодня (20.08.2014), дополнительные знаки в зашифрованной строке — это плюс вашему сайту не только по части поисковиков. Я получил письмо, которое содержало СПАМ. Письмо мне переслал человек, который его изначально получил и который просто увидел, что в нем ссылка имеет вид:

https://d1mon.com/go?url=…

Надеюсь, понятно, что произошло? СПАМеры просто подставляют в мой URL необходимый им адрес в зашифрованном виде. Таким образом, в письме ссылка первым делом наводят на мой сайт, но, по сути, она должна вести на другой сайт.

Естественно, СПАМерский редирект не работал, ведь ссылка была просто закодирована с использованием base64, без применения дополнительных символов, которые мы добавляли с вами выше.

После этого случая я еще усложнил у себя на сайте кодирование ссылок, на всякий случай. :) Сброс кэша обновил все ссылки на сайте. Хотя, может, это и не имело особо смысла. Сомневаюсь, что СПАМеры будут утруждать себя и кодировать свои ссылки с применением дополнительных символов, дабы редирект на моем сайте работал.

15 Комментариев

  1. >Допустим, была ссылка test.ru, стала ваш_сайт.ru/ext_link?url=test

    Это на какой движок сайтов можно ставить, на все? А если редирект прописывать через go? это удобнее будет, или это не одно и тоже?

    • Речь была про движок Drupal 7. Это решение для него. Использовать ext_link или go или другое можно по своему выбору. Одновременно использовать нельзя. Будет работать лишь одни вариант, выбранный вами. Вариант go лично мне нравится больше других.

  2. Владимир

    Установил этот мод, но он не меняет ссылки в статьях. Все сделал как описано в статье, кроме фиксов. В чем проблема?

  3. В этом модуле отсутствует возможность добавлять исключения. Или я не нашла?

  4. Сергей

    Я правильно понимаю, что пофикшеный модуль нельзя обновлять?

    • Да. Можно лишь обновленный модуль снова пофиксить. Я пока пользуюсь старым модулем, смотрел, существенных обновлений пока не было, поэтому не заморачивался.

  5. Я использовал не пофикшенный модуль, а брал новый и фиксил. В результате чего то когда на сайте открываешь страницу где есть видео youtube, то на 3 секунды в окне вместо видео пишет, что вы переходите по внешней ссылке :)). Установка времени задержки 0 вообще видео не проигрывается, пишет что много переадресаций. Может кто сталкивался?

    • Я пробовал дорабатывать новую версию. Ну точнее, посмотрел на код и забросил это дело. :) Мне кажется, что в модуле слишком много лишнего. Думаю, что лучше найти время и сделать отдельный самостоятельный модель, только лишь для кодирования ссылок.

      • Вернулся к пофикшеному и приложеному к этой статье модулю. Ненарадуюсь )) Все работает как надо. Плюс еще радует возможность выборочно «закрывать» ссылки, а не все. Просто в адресе ссылки вместо знака » надо ставить ‘ (апостраф). И ссылка не перекрывается модулем. Один минус — напрягают напоминания про обновление.

  6. Добрый день. Отписал вам ответ у себя на блоге, добавил в плагин альтернативное решение : )

    А чтобы поисковые системы ничего не раскодировали, лучше просто использовать маскировку числовыми значениями ;)

  7. Подумал и сделал класс для парсинга перезагружаемым. Так что можете определить там свои функции redirect и parser — и там кодировать, как душа пожелает : )

Добавить комментарий