Редирект и запрет индексации внешних ссылок

Плагин срабатывает на пререндер страницы, отлавливает все внешние ссылки, и, в зависимости от настроек, делает редирект через внутреннюю страницу, добавляет target="_blank", rel=«nofollow» или оборачивает в noindex.

Доступные параметры:

  • use_redirect — заменять внешние ссылки на редирект через внутреннюю страницу
  • redirect_page_id — ID страницы, которая отвечает за редирект внешних ссылок
  • use_stop_words — использовать стоп слова в адресе ссылки
  • stop_words — список стоп слов, разделитель запятая
  • use_stop_classes — использовать стоп классы (либо другие атрибуты ссылки, идет проверка stripos по полному html коду ссылки)
  • stop_classnames — список стоп атрибутов, разделитель запятая
  • add_blank — добавлять ссылкам атрибут target="_blank"
  • add_nofollow — добавлять ссылкам атрибут rel=«nofollow»
  • add_noindex — добавлять ссылкам обертку noindex
В комплекте идет простенький сниппет extLinkRedirector, который можно использовать с включенным параметром use_redirect. Для этого, создайте новый документ с пустым шаблоном, в поле «Содержимое» вызываем:
[[!extLinkRedirector]]

После сохранения, смотрим ID созданного документа, открываем плагин extLinkRedirector, переходим в параметры, разблокируем параметры по умолчанию. Ставим use_redirect — Да, redirect_page_id — вписываем ID созданного документа. В моем случае, алиас у страницы со сниппетом редиректа задан away, ссылки имеют вид:

http://*****.**/away?url=http://modx.com

Скачать транспортный пакет можно с GitHub

Компонент бесплатный. Буду рад замечаниям и предложениям по улучшению функционала.
Кирилл
15 февраля 2016, 10:55
30
4 648
+14

Комментарии: 37

Виталий Барышников
16 февраля 2016, 14:24
0
Здравствуйте. Не пойму как его поставить. Загрузил транспорт.zip и нажал «Установить», а там ошибка
Консоль запущена...
Пробуем установить пакет с подписью: extlinkredirector-0.1-beta
Пакет найден... сейчас идёт подготовка к его установке.
xPDOZip: Error opening archive at **********/core/packages/extlinkredirector-0.1-beta.transport.zip
Could not unpack package **********/core/packages/extlinkredirector-0.1-beta.transport.zip to **********/core/packages/. SIG: extlinkredirector-0.1-beta
Невозможно установить пакет с подписью: extlinkredirector-0.1-beta
    Кирилл
    16 февраля 2016, 15:11
    0
    Доброго дня. Может быть проблема с правами? На modhost тестовом только что проверил. Да и у меня на 3 сайтах без проблем установилось.



    Проверить работу можно тут: s4437.h2.modhost.pro/
      Виталий Барышников
      16 февраля 2016, 16:55
      0
      Всё хорошо, у меня файл качнулся битым, заново качнул и всё ОК.
Андрей
16 февраля 2016, 22:39
0
На одном новостном сайте как-то приглядывал такие редиректы, но не знал как у себя на MODX реализовать. Спасибо, отличный компонент.
Борода
17 февраля 2016, 09:06
0
Я, по ходу, чего-то не понимаю в этой жизни. Как его правильно скачать с ГитХаба и установить? У меня такая же ошибка как и у Виталия.
Делаю так: ПКМ на extlinkredirector-0.1-beta.transport.zip — сохранить как… Затем в Модэксе загружаю пакет и устанавливаю.
    Кирилл
    17 февраля 2016, 10:45
    0
    Нажимаем на файл extlinkredirector-0.1-beta.transport.zip, потом на кнопку Raw.
    Должно начаться скачивание файла.
      Борода
      17 февраля 2016, 13:22
      0
      Лучи добра тебе, добрый молодец.
Борода
17 февраля 2016, 13:29
0
Автору благодарность!
Можно только чуть подробнее для таких как Я разъяснить следующие параметры:
stop_words — список стоп слов, разделитель запятая
stop_classnames — список стоп атрибутов, разделитель запятая
Не понимаю, зачем и для чего нужны стоп слова и стоп классы)

    Кирилл
    17 февраля 2016, 13:38
    +1
    По этим параметрам исключаются внешние ссылки, которые не должны обрабатываться плагином. Допустим, ссылки на modx.pro и на modstore.pro надо оставить в неизменном виде, в stop_words пишем «modx.pro,modstore.pro» (без кавычек). Таким образом, если в ссылке содержится хоть одна из этих фраз, она вообще никак не модифицируется. Поиск идет по атрибуту «href».

    Параметр stop_classnames работает несколько иначе. Он ищет совпадение слов в полном коде ссылки. У меня за это отвечает класс «extlink». Например, эти ссылки плагин не тронет:

    <a href="http://modx.com" class="extlink">modx.com</a>
    <a href="http://modx.com" data-link="extlink">modx.com</a>
    <a href="http://modx.com" id="extlink">modx.com</a>
      Владимир
      05 августа 2016, 05:42
      0
      А вот эта (stop_words) фишка наиумнейшая))!!! Для мультидоменных сайтов просто must have!
      Вопроос: В репозитарии хоть каком то планируется размещение пакета? Да, ставить секунды, но если из репозитария — удобнее же)
Volk
19 февраля 2016, 09:19
0
Есть небольшая особенность в этом компоненте, если мы пишем стоп слова, то они чувствительны к регистру. Т.е. если напишем в стоп слова site.ru а сама ссылка на сайте будет Site.ru, то исключение не сработает, и нужно в стоп словах прописать site.ru,Site.ru
    Кирилл
    19 февраля 2016, 09:41
    0
    Странно, у меня регистр не имеет значения. Посмотрим, может кто еще отпишется по поводу этой проблемы, сделаем немного по другому. Сейчас вот таким образом проверка идет:

    foreach ($words as $word) if (stripos($data, trim($word)) !== false) return true;

    Документация: stripos — Возвращает позицию первого вхождения подстроки без учета регистра
Борода
12 марта 2016, 13:15
0
Почему, если ссылка относительная, плагин её воспринимает как внешнюю? Редиректа нет, но добавляет target="_blank", rel=«nofollow»

<a rel="nofollow" target="_blank" href="/razdel/categoriya/statya" title="заголовок">

Как это можно поправить?
    Кирилл
    13 марта 2016, 08:45
    0
    Не заметил такой проблемы, вот тут можно поглядеть: s4737.h2.modhost.pro/

    Ссылка	s4737.h2.modhost.pro/manager/
    Логин	s4737
    Пароль	I03qKiPI5gGQ
      Борода
      13 марта 2016, 16:47
      0
      И у меня пропала. Я сайт на https перевёл. Может из-за этого было. Кеш или ещё чего там…
      Благодарю за обратную связь.
Виталий Барышников
26 апреля 2016, 06:57
0
Привет. Не работает с ссылками, в которых есть другие блоки, мой пример:
<a href="http://site1.ru/">Ссылка 1</a> // будет обработана
<a href="http://site1.ru/"> // НЕ будет обработана
            <img src="[[++rb_base_dir]]img/logo1.png" alt="Лого1"/>
            <span>Ссылка 1</span>
</a>
    Кирилл
    26 апреля 2016, 07:42
    +1
    Самое простое — написать весь этот код в одну строку:

    <a href="http://site1.ru/"><img src="[[++rb_base_dir]]img/logo1.png" alt="Лого1"/><span>Ссылка 1</span></a>
Александр
04 августа 2016, 20:52
0
Спасибо за компонент!
Было бы здорово ещё добавить возможность устанавливать задержку в миллисекундах )
    Кирилл
    05 августа 2016, 07:47
    0
    А зачем эта задержка? Что-то даже прикинуть не могу, какая от этого может быть польза.
      Александр
      05 августа 2016, 15:15
      0
      Ну например, баннер рекламный воткнуть какой-нибудь ) или предупреждение, что внешняя ссылка может вести на сайт с вредоносным кодом, предложить не уходить с сайта.
        Кирилл
        11 августа 2016, 14:02
        +1
        Замени сниппет extLinkRedirector на такой
        <?php
        if (isset($_GET['url'])) {
            $url = $modx->stripTags($_GET['url']);
            if (!isset($delay)) $delay = 3;
            else $delay = floatval($delay);
            return '<script>setTimeout(function() { location.href = "'.$url.'"; },'.($delay*1000).');</script>';
        }
        return;
        Потом на странице, которая будет осуществлять редирект вызываем:
        [[!extLinkRedirector? &delay=`5`]]
        Где delay — задержка в секунда перед редиректом. По умолчанию 3 секунды, даже если параметр не указан.
          Александр
          12 августа 2016, 03:50
          0
          Спасибо, как раз то что нужно! )
      Дмитрий Иванов
      05 августа 2016, 18:23
      0
      В чем проблема сделать это самому на странице указанной в redirect_page_id? это же элементарщина
        Konstantin
        11 августа 2016, 13:45
        0
        наверное сложность в том что с этой страницы он не задерживаясь редиректит, а нужно чтобы тыкали или через определенное время автоматом переходило )
          Дмитрий Иванов
          11 августа 2016, 13:49
          0
          А если убрать оттуда сниппет и сделать js редирект с какой нужно задержкой?
Борис И
04 февраля 2017, 11:15
0
Оличное решение, спасибо.
varanika
21 марта 2017, 19:39
0
Вот и у меня что-то не так идет. В верху сайта есть:
<li><a href="[[~1]]" title="[[#1.menutitle]]">[[#1.menutitle]]</a></li>
На выходе
<li><a rel="nofollow" target="_blank" href="/" title="Главная">Главная</a></li>
Хотя на остальных сайтах такого не замечала :(
    Кирилл
    22 марта 2017, 06:13
    0
    Не видя сайта, не смогу помочь. Отправьте ссылку на почту, в профиле кнопка.
    Или, если проблема только с этой ссылкой, можете использовать «stop_classnames».
digorev
23 апреля 2017, 00:01
0
Ребята, а что делать если плагин успешно добавляет nofollow и blank но совсем не реагирует на настройки, да и ссылки не преобразовывает? ( Я уже пробовал по-всякому, ничего не получается
    Кирилл
    23 апреля 2017, 09:05
    0
    На какие настройки не реагирует? Опишите проблему подробнее, желательно с примерами.
Bress
10 августа 2018, 15:10
0
Привет из 2018! Работает ваш плагин на новостном сайте, есть некоторая проблема вот с чем:
на сайте реализован переброс записей из полного оформления в AMP. Во-первых, согласно вашему снипету происходит замена "<a", но следует менять "<a "(с пробелом) так как тег <amp-img… ошибочно заменяется. что касается замены тегов ссылок — в AMP по стандарту не поддерживаются свойства тега . На данный момент я сделал заглушку через replace, но хотел спросить, как изменить код плагина для того, чтобы он запускался на всех страницах, кроме тех. в адресе которых есть, например, "../amp/...". Прошу простить мою безграмотность — я не работаю с php)
    Марат Марабар
    10 августа 2018, 16:38
    0
    В этом плагине проставить пробелыить пробелы

    Кусок кода заменить на этот
    if ((boolean)$extLinkRedirector->config['add_blank']) {
        $link = preg_replace('/target=["\'][^\'".]+["\']/', '', $link);
        $link = str_replace('<a ','<a target="_blank" ',$link);
    }
    if ((boolean)$extLinkRedirector->config['add_nofollow']) {
        $link = preg_replace('/rel=["\'][^\'".]+["\']/', '', $link);
        $link = str_replace('<a ','<a rel="nofollow" ',$link);
    }
    if ((boolean)$extLinkRedirector->config['add_noindex']) {
        $link = str_replace('</a>','</a><!--/noindex-->',$link);
        $link = str_replace('<a ','<!--noindex--><a ',$link);
    }
      Bress
      10 августа 2018, 17:02
      0
      Это было сделано сразу. Вы не прочли мою строку о том, что «в AMP по стандарту не поддерживаются свойства тега ». Любые rel и target не валидны для AMP. Потому мне необходимо именно не применять плагин на страницах с "/amp/" в URL
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.