Короткие ссылки средствами modx

Запрос на помощь вылился в готовый результат.

Пример основной задачи — реализация сайта с кириллическим именем домена, и ссылками так же на кириллице. Типа: сайт.рф/каталог/ресурс

Выглядит красиво, доступно, запоминается, и говорят — полезно для СЕО. Но появилась проблемка, связанная с тем, что при попытке поделиться урлом, порой выводится неудобноваримая ссылка из кучи непонятных символов. Что нибудь типа такого:
...%D1%82%D1%83%D0%BF%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F/%D0%BF%D0%B5%...

Текущая задача — настроить короткие ссылки на латинице для каждого из ресурсов. При этом не использовать сторонние сервисы/сайты.

1. Нужен служебный домен на латинице, для примера site.ru

2. Нужен редирект на уровне веб-сервера со служебного домена на основной

Я реализовал для nginx таким образом (несмотря на то, что apache присутствует как бэкенд):

server {
    server_name site.ru;
    rewrite ^(.*) http://xn--80aswg.xn--p1ai$1 permanent;
}

То есть создан отдельный раздел в конфиге, и запрос site.ru перенаправляет на домен сайт.рф

3. Настройка и вывод короткой ссылки на каждом ресурсе. Благодарность Максиму!

Создать плагин в modx со следующим содержанием

$e = $modx->event;
if ($e->name == 'OnHandleRequest') {
    if (is_numeric($_GET['q'])) {
        $url = $modx->makeUrl($_GET['q'],'','','full');
        if (!empty($url)) $modx->sendRedirect($url,array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));
    }
}

Плагин должен срабатывать на событие OnHandleRequest

В каждом ресурсе короткая ссылка выводится классическим способом:

http://site.ru/[[*id]]

В результате ссылка вида site.ru/9 перенаправит на ресурс с ссылкой вида сайт.рф/каталог/подкаталог/ресурс — в общем, на нужный ресурс с id 9.

Кстати говоря, короткие ссылки используются на многих сайтах с доменами на латинице. Это востребовано там, где много полезных материалов, длинные чпу, и есть потребность делиться ссылками, например через скайпы и телеграмы. Пример: russian.rt.com
Александр Н
10 октября 2016, 21:56
modx.pro
10
6 760
+7

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

Максим
11 октября 2016, 13:04
+1
Вот так можно сделать ссылки типа sitename.ru/9:
$e = $modx->event;
if ($e->name == 'OnHandleRequest') {
    if (is_numeric($_GET['q'])) {
        $url = $modx->makeUrl($_GET['q'],'','','full');
        if (!empty($url)) $modx->sendRedirect($url,array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));
    }
}
    Александр Н
    11 октября 2016, 13:25
    0
    Отлично! Благодарю, всё летает!
      Илья Уткин
      11 октября 2016, 15:08
      2
      +3
      У меня есть вот такой файлик, который позволяет большие числа переводить в 60-ричную систему для сокращения количества символов:

      <?php
      class SixtyCoder {
          public $table = '0123456789abcdefghijkmnopqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ';
          
          public function to60($number = 0) {
              $number = (int) $number;
              $output = '';
              return $this->divide($number);
          }
          
          public function from60($letters = '0') {
              $length = strlen($letters);
              $number = 0;
              for ($i = 0; $i < $length; $i++) {
                  $pos = strpos($this->table, $letters[$i]);
                  if ($pos === false) {
                      return 0;
                  }
                  $pow = $length - ($i+1);
                  $number = $number + $pos * pow (60, $pow);
              }
              return $number;
          }
          
          public function divide($number = 0, $letters = '') {
              if ($number < 60) {
                  $letters = $this->getLetter($number) . $letters;
              } else {
                  $rest = $number % 60;
                  $letters = $this->getLetter($rest) . $letters;
                  $number = ($number - $rest) / 60;
                  $letters = $this->divide($number, $letters);
              }
              return $letters;
          }
          
          public function getLetter($number) {
              return substr($this->table, $number, 1);
          }
      }
      
      $coder = new SixtyCoder();
      $time = time();
      echo 'Long: ' . $time;
      $short = $coder->to60($time);
      echo '
      Short: ' . $short;
      echo '
      Long from short: ' . $coder->from60($short);
      An Si
      11 октября 2016, 23:12
      -2
      С технической точки зрения может всё и в порядке, но для SEO это никуда не годится. Никогда не делайте так, если собираетесь продвигать сайт. Лучше некрасивая прямая ссылка, чем красивая ссылка с домена и адреса, который никогда не были в индексе и по сути никак не относятся к Вашему сайту.

      Ведь 301й редирект это перенаправление со старого адреса страницы на новый. А Вы будете пытаться подсунуть поисковику редирект со страниц, которых никогда и не было. В лучшем случае, такие ссылки поисковые роботы не проиндексируют, в худшем — заподозрят вас в чёрном СЕО со всеми вытекающими последствиями.
        Александр Н
        11 октября 2016, 23:46
        +2
        Не хотелось бы разводить тут халивар на эту тему, поэтому, постараюсь покороче — мне кажется вы ошибаетесь…

        Это ваши опасения или конкретный опыт? Что значит «заподозрят»? Что значит «никогда не было»? Ведь всё, что касается web когда-то отсутствовало, а потом появилось. А что значит «никак не относятся к Вашему сайту», если очень даже относятся — прямым редиректом?

        301 редирект это 301 редирект, без разницы что было раньше а что позже. У того же Яндекса достаточно материалов о 301 редиректе, что бы опасаться последствий. Главное всё сделать правильно, а это на мой взгляд не сложно.

        Допустим по всем соц-сетям появятся короткие ссылки имеющие отношение к боевому сайту. Что бы у робота исчезли все сомнения, достаточно в Robot.txt указать директиву host с указанием на главный домен.

        Я никогда не пользовался биржами ссылок, но есть некоторое представление об их работе. Сильно сомневаюсь в ваших опасениях, имея перед глазами эти представления. Если бы вы были правы, короткие ссылки бы никто не использовал (тем более с использованием сторонних сервисов), или были бы тонны макулатуры на этот счёт, о которых бы мы знали.

        Для многострадального СЕО на мой взгляд пока может быть только одна проблема, в данном случае — если бы короткие ссылки дублировали основные ссылки. Но так как будет редирект — всё в порядке!
          An Si
          12 октября 2016, 09:57
          -2
          мне кажется вы ошибаетесь
          Я работаю в крупнейшей SEO компании России, поэтому Вам кажется. Знал что нельзя на таких сайтах поднимать эту тему. На этом и закончим, удачи.
          Александр Н
          12 октября 2016, 00:00
          -1
          goo.gl/ — укорачивать от Гугла
          clck.ru/ — укорачиватель от Яндекса

          Вот эти сервисы точно не имеют никакого отношения к любому моему сайту.

          Ещё немного правильных терминов от Яндекса

          «301 — постоянное перенаправление;»
          «a.ru/index1.html -> b.ru/index2.html — межхостовое перенаправление»
          yandex.ru/support/webmaster/robot-workings/managing-redirects.xml

          И вообще — в данном случае произойдёт склейка доменов, и вес домена для коротких ссылок будет положительно влиять на вес основного домена. И короткие ссылки как раз нужны для того, что бы пользователи ими более активно делились. И это не единственный их плюс.

          Короче — коротко не получилось у меня)
            Вадим
            12 октября 2016, 15:08
            +2
            что-то мне подсказывает, что лучше для SEO стоит воспользоваться API(api_key) Гугла (или Яндекса, кому что нравиться) для формирования и подстановки этих ссылок :)
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          9