Короткие ссылки средствами 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
11 october 2016, 00:56    Александр Н   
7    673 +7

Comments (9)

  1. Максим 11 october 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'));
        }
    }
    
    1. Александр Н 11 october 2016, 13:25 # 0
      Отлично! Благодарю, всё летает!
      1. Илья Уткин 11 october 2016, 15:08 # +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);
        1. Александр Н 11 october 2016, 17:32 # 0
          Благодарю!
          Уверен пригодится
        2. An Si 11 october 2016, 23:12 # -2
          С технической точки зрения может всё и в порядке, но для SEO это никуда не годится. Никогда не делайте так, если собираетесь продвигать сайт. Лучше некрасивая прямая ссылка, чем красивая ссылка с домена и адреса, который никогда не были в индексе и по сути никак не относятся к Вашему сайту.

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

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

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

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

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

            Для многострадального СЕО на мой взгляд пока может быть только одна проблема, в данном случае — если бы короткие ссылки дублировали основные ссылки. Но так как будет редирект — всё в порядке!
            1. An Si 12 october 2016, 09:57 # -2
              мне кажется вы ошибаетесь
              Я работаю в крупнейшей SEO компании России, поэтому Вам кажется. Знал что нельзя на таких сайтах поднимать эту тему. На этом и закончим, удачи.
            2. Александр Н 12 october 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

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

              Короче — коротко не получилось у меня)
              1. Вадим 12 october 2016, 15:08 # +2
                что-то мне подсказывает, что лучше для SEO стоит воспользоваться API(api_key) Гугла (или Яндекса, кому что нравиться) для формирования и подстановки этих ссылок :)
            You need to login to create comments.