Создаём умный robots.txt на PHP
Или как усидеть на нескольких стульях сразу

Каждый вебмастер сталкивается с ситуацией, когда необходимо использовать два (или более) одинаковых файлов sitemap.xml на одном сайте, но для разных поисковых систем с разным синтаксисом. Вписать несколько раз директиву Sitemap в файл robots.txt в нескольких вариантах не представляется возможным, так как файл не проходит валидацию или подхватывает не ту директиву, а в некоторых случаях подхватывает сразу обе директивы, а следом ругается на то, что файлы ведут к одним и тем же записям. В любом случае образовывается неблагоприятная ситуация с точки зрения поисковой оптимизации, которую можно решить применив решение описанное здесь.
Некоторые вебмастера и вовсе не используют никакие файлы sitemap или используют их, но не придают особого значения тому, в каком виде генерируются эти файлы, игнорируют ошибки, которые могут обернуться санкциями со стороны поисковых систем.
Различия файлов sitemap для Яндекса и Google
Для Яндекса используется простая карта сайта без указания адресов изображений и их принадлежности к тому или иному посту, например:
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>
https://site.ru/some-daily-news.html
</loc>
<changefreq>daily</changefreq>
<lastmod>2017-07-19T00:30:02+00:00</lastmod>
<priority>1.0</priority>
</url>
<url>
<loc>
https://site.ru/some-other-news.html
</loc>
<changefreq>daily</changefreq>
<lastmod>2017-07-19T00:30:02+00:00</lastmod>
<priority>1.0</priority>
</url>
</urlset>
Она проходит валидацию в Яндекс.Вебмастере и хорошо им индексируется. Так же sitemap c таким синтаксисом можно использовать и для Google, файл пройдёт валидацию и добавится в Google Console без проблем, но по хорошему счёту для гугла нужно использовать карту сайта с указанием изображений:
Не пренебрегай такими мелочами, старайся выполнять рекомендации, которые предоставляют поисковые системы .
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">
<url>
<loc>
http://site.ru/some-daily-news.html
</loc>
<changefreq>daily</changefreq>
<lastmod>2017-07-19T00:30:02+00:00</lastmod>
<priority>1.0</priority>
<image:image>
<image:loc>
http://site.ru/image/cache/catalog/2017/04/19/dsc_4035-site.ru-650x650.jpg
</image:loc>
<image:caption>Alt изображения 1</image:caption>
<image:title>Title изображения 1</image:title>
</image:image>
</url>
<url>
<loc>
http://site.ru/some-other-news.html
</loc>
<changefreq>daily</changefreq>
<lastmod>2017-07-19T00:30:02+00:00</lastmod>
<priority>1.0</priority>
<image:image>
<image:loc>
http://site.ru/image/cache/catalog/2017/04/21/img_5169-site.ru-650x650.jpg
</image:loc>
<image:caption>Alt изображения 2</image:caption>
<image:title>Title изображения 2</image:title>
</image:image>
</url>
</urlset>
Это рекомендуемый формат файла, который позволит тебе ускорить индексацию нашего ресурса поисковым роботом от Google и ему подобным.
Готовим файлы к правке и вносим изменения
Для того, чтобы иметь возможность безболезненно вписывать сколько угодно много директив Sitemap в файл robots.txt, тебе необходимо проделать следующие действия: В корневой директории твоего сайта нужно создать файл с расширением .php и произвольным именем, к примеру robots-xYz01Q.php, затем переименовать файл robots.txt в old-robots.txt
Метод работает на web-серверах под управлением Apache или Nginx+Apache с исполнением файлов .htaccess в поддерикториях сайта.

Ты можешь назвать новый файл как угодно, но желательно, чтобы этот файл имел длинное и трудное название.
и в файле .htaccess после строк
RewriteEngine On
RewriteBase /
необходимо добавить строку
Rewriterule ^robots\.txt$ /robots-xYz01Q.php [L]
Где robots-xYz01Q — название созданного тобою файла выше. После этого тебе необходимо перенести содержимое файла old-robots.txt в файл robots-xYz01Q.php, например ты имеешь такой файл:
При обращении к файлу /robots.txt сервер будет отдавать клиенту содержимое файла /robots-xYz01Q.php
User-agent: *
Allow: /
Disallow: /admin
Host: http://site.ru
Sitemap: http://site.ru/yandex_sitemap.xml
Sitemap: https://site.ru/google_sitemap.xml
После переноса данных начинай редактировать файл, добавляй проверку по User-agent, чтобы каждому роботу показать, что ты его узнал и показываешь ему информацию, которая предназначена конкретно для него. Для этого тебе необходимо заменить
User-agent: *
на
<?php if (isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/yandex/', strtolower($_SERVER['HTTP_USER_AGENT']))) { ?>
# Показываем боту Яндекса
User-agent: Yandex
Crawl-delay: 0.5
<?php } elseif (isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/mail.ru/', strtolower($_SERVER['HTTP_USER_AGENT']))) { ?>
# Показываем боту MAIL.RU
User-agent: Mail.Ru
<?php } elseif (isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/google/', strtolower($_SERVER['HTTP_USER_AGENT']))) { ?>
# Показываем боту Google
User-agent: Googlebot
<?php } else { ?>
# Показываем всем остальным
User-agent: *
<?php } ?>
Затем тебя интересуют последние две строки:
Sitemap: http://site.ru/yandex_sitemap.xml
Sitemap: https://site.ru/google_sitemap.xml
Заменяй их на следующие:
<?php if (isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/yandex|mail.ru|rambler/', strtolower($_SERVER['HTTP_USER_AGENT']))) { ?>
Sitemap: http://site.ru/yandex_sitemap.xml
<?php } else { ?>
Sitemap: https://site.ru/google_sitemap.xml
<?php } ?>
В итоге у тебя должен получиться файл со следующим содержимым:
скачать готовый шаблон robots-xYz01Q.php
<?php if (isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/yandex/', strtolower($_SERVER['HTTP_USER_AGENT']))) { ?>
# Показываем боту Яндекса
User-agent: Yandex
Crawl-delay: 0.5
<?php } elseif (isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/mail.ru/', strtolower($_SERVER['HTTP_USER_AGENT']))) { ?>
# Показываем боту MAIL.RU
User-agent: Mail.Ru
<?php } elseif (isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/google/', strtolower($_SERVER['HTTP_USER_AGENT']))) { ?>
# Показываем боту Google
User-agent: Googlebot
<?php } else { ?>
# Показываем всем остальным
User-agent: *
<?php } ?>
Allow: /
Disallow: /admin
Host: http://site.ru
<?php if (isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/yandex|mail.ru|rambler/', strtolower($_SERVER['HTTP_USER_AGENT']))) { ?>
Sitemap: http://site.ru/yandex_sitemap.xml
<?php } else { ?>
Sitemap: https://site.ru/google_sitemap.xml
<?php } ?>
Заключение и выводы
Готово! Ты сделал простую, но гибкую систему, которая позволяет определять тех или иных поисковых роботов и отдавать им ту информацию, которую нужно. Чтобы более точно фильтровать ботов, ты можешь изучить основных User-agent’ов, которых использую те или иные поисковые системы (у каждой из них имеется такой список в свободном доступе).
Данный подход можно использовать и для решения других, более сложных задач, связанных с внутренней SEO-оптимизацией твоего сайта.
Бот Яндекса видит твой файл следующим образом:
# Показываем боту Яндекса
User-agent: Yandex
Crawl-delay: 0.5
Allow: /
Disallow: /admin
Host: http://site.ru
Sitemap: http://site.ru/yandex_sitemap.xml
Google-бот видит этот же файл, но уже по-другому:
# Показываем боту Google
User-agent: Googlebot
Allow: /
Disallow: /admin
Host: http://site.ru
Sitemap: https://site.ru/google_sitemap.xml
Бот Mail.Ru видит файл следующим образом:
# Показываем боту MAIL.RU
User-agent: Mail.Ru
Allow: /
Disallow: /admin
Host: http://site.ru
Sitemap: http://site.ru/yandex_sitemap.xml
Бот Рамблера видит так:
# Показываем всем остальным
User-agent: *
Allow: /
Disallow: /admin
Host: http://site.ru
Sitemap: http://site.ru/yandex_sitemap.xml
А остальные боты и твой браузер, видят файл так:
# Показываем всем остальным
User-agent: *
Allow: /
Disallow: /admin
Host: http://site.ru
Sitemap: https://site.ru/google_sitemap.xml
Ключевым моментом твоих манипуляций, является то, что ты без каких-либо ошибок отдаёшь разным ботам необходимый файл с картой сайта из одного и того-же файла. Если ты будешь более любопытным и посмотришь как в твоём браузере будет отображаться файл, который ты создал, то можешь очень удивиться:

В браузере все директивы файла robots.txt сбиваются в «стаю» и становятся едва-ли читаемыми, но не для поисковых роботов!

Все роботы автоматически переносят каждую директиву на новую строку и прекрасно читают твой файл.

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