За обновлениями можно следить в telegram-канале https://t.me/quasiart

При миграции сайта с домена на домен или с сервера на сервер неизбежно возникает необходимость менять какие-либо данные (пути в конфигурационных файлах, доступы к БД и пр.). К таким данным также относится содержимое robots.txt. Обычно всё, что нужно поменять в файле, это доменное имя. Также во время разработки сайта требуется запретить его индексацию (например, в том случае, когда сайт разрабатывается локально и периодически загружается на удалённый сервер, чтобы показать заказчику). И если сайтов много, то надоедает постоянно следить за содержимым этого файла, а зачастую про него можно просто забыть.

Для автоматизации таких повседневных задач я написал сниппет, который автоматически генерирует содержимое robots.txt.

Здесь нет объяснений, зачем нужен robots.txt, что значат его директивы и так далее. При желании можно адаптировать моё решение практически под любую задачу — я же описал то решение, которое устроило меня.

Код дополнения открыт, следить за обновлениями и предлагать свои идеи можно на GitHub: https://github.com/mishantrop/quasirobots

Установка

  1. Создать ресурс (шаблон: «(пустой шаблон)», псевдоним: «robots», тип содержимого: «text», отключить HTML-редактор, опубликовать).
  2. Создать сниппет с названием «quasiRobots», код ниже.
  3. Добавить в ресурс вызов сниппета, примеры ниже.

Теперь «файл» robots.txt будет доступен по адресу https://site.ru/robots.txt.

Код сниппета

$output = '';
$site_status = (int)$modx->getOption('site_status', $scriptProperties, 1);
$site_url = $modx->getOption('site_url', null, '');
$sitemap = (int)$modx->getOption('sitemap', $scriptProperties, 0);

$disallow = [
	'User-agent: *',
	'Disallow: /assets/components',
	'Disallow: /connectors',
	'Disallow: /core',
	'Disallow: /manager',
	'Disallow: /search',
	'Disallow: /index.php',
	'Disallow: /?',
];

$offlineText = [
	'User-agent: *',
	'Disallow: /'
];

if ($site_status === 1) {
	$output = implode("\n", $disallow);
	$output .= "\nHost: ".$modx->getOption('site_url', null, '');
	if ($sitemap > 0) {
		$output .= "\nSitemap: ".$modx->makeUrl($sitemap, '', '', 'full');
	}
} else {
	$output = implode("\n", $offlineText);
}

return $output;

Пример вызова

[[!quasiRobots?
    &site_status=`1`
    &sitemap=`189`
]]

Параметры

Параметр Описание Значение по умолчанию
site_status Статус сайта: 1 или 0. 1
sitemap Идентификатор карты сайта.

Ещё больше автоматизации

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

Решение №1

Вручную указывать site_status в вызове сниппета. Но этот вариант не подходит, если постоянно идёт синхронизация базы данных (экспорт с локального сервера и импорт на удалённый).

Решение №2

На сервере, где идёт разработка или на котором размещён сайт, который нужно запретить от индексации, добавить такую переменную (например, в начале файла .htaccess).

SetEnv MODX_ENV development

Затем создать сниппет с названием, например, site_status. Код ниже.

return ($modx->getOption('MODX_ENV', $_SERVER, '') == 'development') ? 0 : 1;

И тогда вызов сниппета quasiRobots будет такой:

[[!quasiRobots?
    &site_status=`[[!site_status]]`
    &sitemap=`189`
]]

Результат

Доступный для индексации сайт

User-agent: *
Disallow: /connectors/
Disallow: /assets/components/
Disallow: /library/tags
Disallow: /search
Disallow: /index.php
Disallow: /?
 
Host: https://quasi-art.ru
Sitemap: https://quasi-art.ru/sitemap.xml

Сайт с запретом на индексацию

User-agent: *
Disallow: /