Отключение или запрет индексации страниц объектов коллекции

В сайтах на основе Простой модели могут автоматически выводиться страницы объектов коллекции. Это связано с тем, что каркасный код таких сайтов обычно автоматически выводит страницы объектов стандартных коллекций (категорий, имеющих режим разрешений 2 или 3). Но подобные страницы нужны не всегда, например для «микроблога» может быть достаточно вывода сообщений только в ленте сообщений. Разберем этот случай на примере коллекции info и ее объекта с идентификатором 1.

Конечно, в этом случае проще всего прямо в контроллере вызвать обработчик ошибки 404 или пробросить соответствующее исключение, например в G-Drive контроллер коллекции info можно дополнить следующим кодом:

if (isset($r1))
{
  error(404);
  return;
}

Но для Gency такой способ имеет один недостаток, если в ней нужна функция просмотра объектов коллекции в пользовательском представлении, потому что данная функция реализуется при поддержке «головной» части сайта. Если это необходимо, просмотр объекта должен быть обеспечен при запросе по адресу /info/1 к «головной» части сайта. По данному адресу можно непосредственно выводить страницу объекта или выполнять перенаправление. Допустим, такая функция нужна.

Вместо отключения страниц объектов коллекции обычно достаточно запретить их индексацию. Для этого в файле robots.txt можно использовать следующую директиву:

Disallow: /info/

Данный запрет не затрагивает страницу по адресу /info, поэтому на ней можно разместить, например, ленту сообщений «микроблога». (Но если используется адресация с завершающим слешем, то страница по адресу /info/ уже попадает под действие этой директивы, так же как и /info/1.)

Адресам страниц объектов коллекции можно найти и полезное применение. Например, их можно использовать для перенаправления на соответствующие сообщения ленты сообщений. Для многостраничной ленты сообщений от этого будет наибольшая польза: адрес /info/1 будет постоянным, а адрес /info#1 со временем может меняться на /info?p=2#1 и т.д. В G-Drive такая функция может быть реализована следующим образом:

<?php

require INCLUDE_PATH.'redirect.php';
require INCLUDE_PATH.'pagelink.php';
require PATH.'include/pnbyid.php';

try
{
  if (isset($r1))
  {
    if ($page['active'])
    {
      rotation01(1); // в адресе первой страницы не должно быть "?p=1"
      redirect(pagelink(pnbyid($page['id']), '').'#'.$page['id']);
    }
    else
    {
      error(404);
    }
    return;
  }

  // здесь можно разместить код для ленты сообщений
}
catch (Exception $e) { error(503); }

Пример реализации функции pnbyid, позволяющей получить номер страницы ленты сообщений, на которой находится сообщение, по идентификатору этого сообщения:

<?php

require_once INCLUDE_PATH.'query.php';

function pnbyid($id, $pp=10)
{
  global $table;
  $result = query("SELECT COUNT(*) DIV $pp + 1 FROM `{$table('info')}` WHERE `active` AND `id`>$id");
  list($pn) = $result->fetch_row();
  $result->free();
  return $pn;
}

Подобное перенаправление лучше использовать совместно с показанной выше директивой файла robots.txt.

Категория ленты сообщений может отличаться от коллекционной, например лента сообщений может размещаться в пустой категории. В этом случае для отключения страниц по адресам наподобие /info можно использовать режим разрешений 3 (и не создавать пустой объект в коллекции info).

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

  1. Админ

    Демонстрация работы перенаправления на примере одностраничной «ленты»: https://p20.ru/features/parking (обратите внимание, как меняется адрес).

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

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