Короткие ссылки средствами G-Drive

Для создания коротких ссылок можно воспользоваться каким-нибудь сервисом или потратить несколько минут и сделать свой собственный укоротитель ссылок средствами G-Drive без установки каких-либо сторонних модулей. Достаточно написать несколько строк кода и интегрировать их в новый или существующий сайт на платформе G-Drive/Gency.

Создайте в каталоге mods вашего сайта файл go.h.php следующего содержания:

<?php

header('Location: '.$page['link']);
exit;

Создайте в подготовленной для нового сайта базе данных таблицу категорий, выполнив следующий запрос:

CREATE TABLE `site_categories` (
  `id` varchar(10) NOT NULL,
  `link` tinytext NOT NULL,
  `bits` tinyint unsigned NOT NULL DEFAULT 32,
  `module` varchar(10) NOT NULL DEFAULT 'go',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

Для управления короткими ссылками с помощью Gency создайте в базе данных вашего сайта представление и категорию, выполнив следующие запросы:

ALTER TABLE `site_categories` ADD KEY (`module`);

CREATE ALGORITHM=MERGE VIEW `site_go` AS
  SELECT `id`, `link` FROM `site_categories` WHERE `module`='go';

INSERT INTO `site_categories` (`id`, `link`, `bits`, `module`) VALUES
('go', '', 35, '');

Для запрета дублирования коротких ссылок по адресам формата /go/* можно указать в поле module созданной категории имя 404 и создать в каталоге mods вашего сайта файл 404.h.php следующего содержания:

<?php error(404);

Для интеграции поддержки коротких ссылок в существующий сайт вместо поля link можно использовать любое другое текстовое поле подходящего размера, например name или content, но нужно учитывать, что при добавлении целевой ссылки в поле, допускающее форматирование текста, вместе со ссылкой могут попадать теги форматирования текста. Чтобы этого избежать, целевую ссылку нужно вводить в режиме отображения HTML-кода, очищая содержимое поля от тегов. Также можно очищать значение поля от тегов непосредственно во время выполнения при помощи функции strip_tags.

Если в таблице категорий существующего сайта отсутствует поле module, можно размещать ссылки в отдельной таблице, создав соответствующую категорию. При этом формат коротких ссылок усложнится до, например, /go/*, а структура таблицы может быть упрощена до двух основных полей (id и link). Интересной особенностью подобных ссылок является то, что их идентификационная часть может быть многокомпонентной, например to/home (в целом ссылка будет иметь вид /go/to/home).

На главной странице специально созданного для коротких ссылок сайта можно разместить полный каталог (публичных) ссылок, расширив структуру таблицы полями name, content и т.п. Каталог можно сделать иерархическим, расширив структуру таблицы полем category и т.п., добавив дополнительные таблицы или представления.

На основе описанной технологии мы планируем создать персональный сервис коротких ссылок, для которого было зарегистрировано около двухсот доменов формата БЦЦ (буква-цифра-цифра) в зоне RU. Домены будут предоставляться по цене от 150 руб./год с гарантированной возможностью полной передачи прав на их использование за отдельную плату. Естественно, пользователи будут иметь возможность прикреплять к сервису и собственные домены. Другим источником монетизации сервиса может быть размещение рекламы в каталогах публичных ссылок и на появляющихся при переходе по ссылкам «страницах ожидания». Было бы интересно узнать ваше мнение о востребованности подобного сервиса.

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

  1. Юлия

    Для поддержки двойного редиректа можно добавить перед вызовом функции header следующий код:

    if (empty($r1))
    {
      if (strlen($p1))
      {
        if ($p1!=strval($t=time()>>3)&&$p1!=strval($t-1))
        {
          error(404);
          return 1;
        }
      }
      else
      {
        if (strlen($p0)&&$r0['bits']&1)
        {
          $page['link']=$p.'/'.(time()>>3);
        }
      }
    }
    

    Двойной редирект может включаться индивидуально для каждой ссылки при помощи установки бита 0 поля bits. Данный код не предназначен для ссылок формата /go/*, но во избежание возможных ошибок в него было добавлено ветвление с условием empty($r1). Также данный код не предназначен для пустой ссылки /, но во избежание возможных ошибок в него было добавлено условие strlen($p0). Чтобы избавиться от данных ограничений, контрольный ключ можно передавать не через объект, а через параметр p, но для этого нужно расширить диапазон допустимых значений параметра в коде движка.

  2. Юлия

    В версии движка 3.07 диапазон допустимых значений параметра расширен до десяти цифр, поэтому делать это специально для передачи контрольного ключа при двойном редиректе не нужно. Фрагмент кода из предыдущего комментария с использованием параметра p может выглядеть так:

    if ($pn)
    {
      if ($pn!=($t=time()>>3)&&$pn!=$t-1)
      {
        error(404);
        return 1;
      }
    }
    else
    {
      if ($r0['bits']&4<<(strlen($p1)>0))
      {
        $page['link']=$p.'?p='.(time()>>3);
      }
    }
    

    Двойной редирект может включаться индивидуально для каждой однокомпонентной ссылки при помощи установки бита 2 поля bits и сразу для всех многокомпонентных ссылок при помощи установки бита 3 поля bits.

  3. Adam Baburin

    Как определить источник трафика с помощью php скрипта?

  4. Юлия

    В общем случае источник определяется по самой ссылке. Можно создать для каждого источника отдельную ссылку и размещать ее исключительно в этом источнике. Также можно добавлять к ссылке какой-либо модификатор, идентифицирующий источник размещения ссылки. Например, в G-Drive в качестве модификатора ссылки можно использовать объект или параметр p (при использовании двойного редиректа один параметр используется для передачи контрольного ключа, другой – идентификатора источника размещения ссылки).

    В качестве дополнительной информации об источнике можно использовать значение переменной $_SERVER['HTTP_REFERER'], предварительно проверив ее существование.

  5. Юлия

    Большинство из упомянутых в статье доменов до сих пор не используется. В связи с этим предлагаю их использовать вам под короткие ссылки по цене от 200 руб./год. G-Drive последней версии прилагается. Вы также становитесь тестером этого движка, что дает вам возможность получать новые версии в числе первых. Для неопытных пользователей я буду иногда проводить «мастер-классы» по использованию движка.

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

  6. Андрей

    Здравствуйте, а можно использовать G-Drive для редиректа внутри сайта? Например, пишется новая статья, которая размещается на новом адресе, после чего со старой ставится редирект на новую.

  7. Юлия

    Да, конечно. Причем вы можете использовать целевую ссылку упрощенного формата, начинающуюся с косой черты, например /article, или даже относительную ссылку, например article. Правда, в последнем случае желательно указать префикс / непосредственно в команде header и при этом не использовать в таблице ссылки другого формата, либо использовать для каждого формата отдельный модуль.

    Если у вас исходная ссылка – многокомпонентная, например /old/article, то вам необходимо создать таблицу site_old и категорию old так, как описано в статье.

    И, самое главное, нужно состыковать G-Drive с используемым вами движком, так как, судя по всему, для отображения статей вы используете не G-Drive. Для состыковки можно использовать «хак» примерно так, как описано в статье «WP-перенаправление со сменой post_id на postname».

  8. Юлия

    Добавила на сайт просмотр комментариев по адресам формата /comment/*, который является более сложным примером перенаправления в пределах одного сайта, чем описанный выше. Код модуля:

    <?php
    
    if ($page['published'])
    {
      $pp=require(PATH.'include/comments-per-page.php');
      if ($result=mysqli_query($link,'SELECT `id`,(SELECT COUNT(*) DIV '.$pp.'+1 FROM `site_comment` WHERE `id`<'.$page['id'].' AND `art`='.$page['art'].' AND `published`) `pn` FROM `site_categories` WHERE `art`='.$page['art']))
      {
        $row=mysqli_fetch_assoc($result);
        mysqli_free_result($result);
    
        if ($row)
        {
          require(PATH.'include/rotate01.php');
          $id=&$row['id'];
          header('Location: /'.pagelink($row['pn'],'id').'#'.$page['id']);
          $r0['module']='exit';
        }
        else error(404);
      }
      else error(503);
    }
    else error(404);
    

    Подключение модуля:

    INSERT INTO `site_categories` (`id`, `name`, `bits`, `module`) VALUES
    ('comment', 'Комментарии', 99, '');
    

Отправить комментарий

Ваш адрес E-mail не будет опубликован.