При миграции сайта с домена на домен или с сервера на сервер неизбежно возникает необходимость менять какие-либо данные (пути в конфигурационных файлах, доступы к БД и пр.). К таким данным также относится содержимое robots.txt. Обычно всё, что нужно поменять в файле, это доменное имя. Также во время разработки сайта требуется запретить его индексацию (например, в том случае, когда сайт разрабатывается локально и периодически загружается на удалённый сервер, чтобы показать заказчику). И если сайтов много, то надоедает постоянно следить за содержимым этого файла, а зачастую про него можно просто забыть.
Для автоматизации таких повседневных задач я написал сниппет, который автоматически генерирует содержимое robots.txt.
Здесь нет объяснений, зачем нужен robots.txt, что значат его директивы и так далее. При желании можно адаптировать моё решение практически под любую задачу — я же описал то решение, которое устроило меня.
Код дополнения открыт, следить за обновлениями и предлагать свои идеи можно на GitHub: https://github.com/mishantrop/quasirobots
Установка
- Создать ресурс (шаблон: «(пустой шаблон)», псевдоним: «robots», тип содержимого: «text», отключить HTML-редактор, опубликовать).
- Создать сниппет с названием «quasiRobots», код ниже.
- Добавить в ресурс вызов сниппета, примеры ниже.
Теперь «файл» 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: /