Создаём умный robots.txt на PHP

Или как усидеть на нескольких стульях сразу

Создаём умный 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 в поддерикториях сайта.

Создаём умный robots.txt на PHP
Права на созданный файл необходимо выставить в 0644

Ты можешь назвать новый файл как угодно, но желательно, чтобы этот файл имел длинное и трудное название.

и в файле .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 на PHP
Все данные отображаются в одну строку и прочитать файл становится невозможным, но не для роботов!

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

Создаём умный robots.txt на PHP
Результат проверки файла robots.txt в Яндекс.Вебмастере

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

Создаём умный robots.txt на PHP
Результат проверки файла robots.txt в Google Console

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

Плюсануть
Поделиться
Отправить
Запинить
Понравился этот пост? Поделись им в соцсети!
Популярное
6 комментариев
Алекс
Алекс

7 декабря 2017, 12:00

Сделал всё по инструкции но прописал файлы sitemap для яндекса и гугла так как они обозначались в статье по созданию sitemap. В итоге яндекс видит afk robots.txt предназначенный для остальных* ботов и ссылку на карту сайта для Гугла.

Александр Окатьев

Странно, условия отбора по User-agent у Вас правильно прописаны для Яндекса? Можете показать код файла robots.php, который у Вас получился в итоге?

Алекс
Алекс

7 декабря 2017, 12:16

Я подумал что нужно поправить в коде HTTP на HTTPS везде. В итоге получилось так как описал раньше. Сейчас убрал S. Яндекс увидел правильно. Вопрос. А если для робота Googlebot добавлять правила отличные от правил для яндекса как быть?

Алекс
Алекс

7 декабря 2017, 12:19

файл получился такой:
<?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’]))) { ?>
User-agent: Mail.Ru
<?php } elseif (isset($_SERVER[’HTTP_USER_AGENT’]) && preg_match(’/google/’, strtolower($_SERVER[’HTTP_USER_AGENT’]))) { ?>
User-agent: Googlebot
<?php } else { ?>
User-agent: *
<?php } ?>

Disallow: /*route=account/
Disallow: /*route=affiliate/
Disallow: /*route=checkout/
Disallow: /*route=product/search
Disallow: /index.php?route=product/product*&manufacturer_id=
Disallow: /admin
Disallow: /catalog
Disallow: /system
Disallow: /*?sort=
Disallow: /*&sort=
Disallow: /*?order=
Disallow: /*&order=
Disallow: /*?limit=
Disallow: /*&limit=
Disallow: /*?filter=
Disallow: /*&filter=
Disallow: /*?filter_name=
Disallow: /*&filter_name=
Disallow: /*?filter_sub_category=
Disallow: /*&filter_sub_category=
Disallow: /*?filter_description=
Disallow: /*&filter_description=
Disallow: /*?tracking=
Disallow: /*&tracking=

Host: https://site.ru
<?php if (isset($_SERVER[’HTTP_USER_AGENT’]) && preg_match(’/yandex|mail.ru|rambler/’, strtolower($_SERVER[’HTTP_USER_AGENT’]))) { ?>
Sitemap: https://site.ru/1_ya_sitemap.xml
<?php } else { ?>
Sitemap: https://site.ru/1_g_sitemap.xml
<?php } ?>
русские буквы и # удалил. Правильно?

Александр Окатьев

Да, это были комментарии для удобства понимания, как читает файл тот или иной поисковик. Для того, чтобы показывать разным поисковым ботам разный контент, Вы можете добавить следующий блок в ваш файл robots.php над или под имеющиеся правила Allow, Disallow.

# Добавляем секцию с правилами для разных поисковых ботов СТАРТ
<?php if (isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/yandex|mail.ru|rambler/', strtolower($_SERVER['HTTP_USER_AGENT']))) { ?>
Disallow: /1-правила-для-ботов-yandex-mailru-rambler
<?php } else { ?>
Disallow: /2-правила-для-ботов-google-и-других
<?php } ?>
# Добавляем секцию с правилами для разных поисковых ботов КОНЕЦ

То есть у Вас будут общие правила для всех поисковых ботов (которые находятся за пределами этого блока) и частные правила для тех или иных поисковиков. Либо же Вы можете переместить имеющиеся правила целиком в обе секции этого блока и настроить один показ набора правил для роботов Yandex, Mail, Rambler и другой показ набора правил для Google, Yahoo, Bing и других, например:

<?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']))) { ?>
User-agent: Mail.Ru
<?php } elseif (isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/google/', strtolower($_SERVER['HTTP_USER_AGENT']))) { ?>
User-agent: Googlebot
<?php } else { ?>
User-agent: *
<?php } if (isset($_SERVER['HTTP_USER_AGENT']) && preg_match('/yandex|mail.ru|rambler/', strtolower($_SERVER['HTTP_USER_AGENT']))) { ?>

# Показываем содержимое файла для русскоязычных поисковых роботов
Disallow: /*route=account/
Disallow: /*route=affiliate/
Disallow: /*route=checkout/
Disallow: /*route=product/search
Disallow: /index.php?route=product/product*&manufacturer_id=
Disallow: /admin
Disallow: /catalog
Disallow: /system
Disallow: /*?sort=
Disallow: /*&sort=
Disallow: /*?order=
Disallow: /*&order=
Disallow: /*?limit=
Disallow: /*&limit=
Disallow: /*?filter=
Disallow: /*&filter=
Disallow: /*?filter_name=
Disallow: /*&filter_name=
Disallow: /*?filter_sub_category=
Disallow: /*&filter_sub_category=
Disallow: /*?filter_description=
Disallow: /*&filter_description=
Disallow: /*?tracking=
Disallow: /*&tracking=

Host: https://site.ru
Sitemap: https://site.ru/1_ya_sitemap.xml

<?php } else { ?>

# Показываем содержимое файла для иностранных поисковых роботов
Disallow: /*route=account/
Disallow: /*route=affiliate/
Disallow: /*route=checkout/
Disallow: /*route=product/search
Disallow: /index.php?route=product/product*&manufacturer_id=
Disallow: /admin
Disallow: /catalog
Disallow: /system
Disallow: /*?sort=
Disallow: /*&sort=
Disallow: /*?order=
Disallow: /*&order=
Disallow: /*?limit=
Disallow: /*&limit=
Disallow: /*?filter=
Disallow: /*&filter=
Disallow: /*?filter_name=
Disallow: /*&filter_name=
Disallow: /*?filter_sub_category=
Disallow: /*&filter_sub_category=
Disallow: /*?filter_description=
Disallow: /*&filter_description=
Disallow: /*?tracking=
Disallow: /*&tracking=

Host: https://site.ru
Sitemap: https://site.ru/1_g_sitemap.xml

<?php } ?>
Алекс
Алекс

7 декабря 2017, 12:29

Гугл тоже увидел свои файлы. Спасибо, за такие полезные статьи и за то что делитесь своим знанием с нами! Теперь пойду в статью: Добавляем Last-Modified в http-заголовки Opencart. Надеюсь получится))

Александр Окатьев

Всегда рад помочь, обращайтесь!

Sergey63
Sergey63

9 октября 2018, 16:49

Вот код покороче (не нужен strtolower и т. д.)
<?php
if (isset($_SERVER[’HTTP_USER_AGENT’]) && preg_match(’/yandex/i’, $_SERVER[’HTTP_USER_AGENT’])) { ?>
User-agent: Yandex
Crawl-delay: 0.5
<?php } elseif (isset($_SERVER[’HTTP_USER_AGENT’]) && preg_match(’/mail\.ru/i’, $_SERVER[’HTTP_USER_AGENT’])) { ?>
User-agent: Mail.Ru
<?php } elseif (isset($_SERVER[’HTTP_USER_AGENT’]) && preg_match(’/google/i’, $_SERVER[’HTTP_USER_AGENT’])) { ?>
User-agent: Googlebot
<?php } else { ?>
User-agent: *
<?php }
?>
Disallow: /*li_op=
Disallow: /*tag=
Disallow: /*search=
Disallow: /*manufacturer_id=
Disallow: /admin
Disallow: /catalog
Disallow: /system
Disallow: /*sort=
Disallow: /*order=
Disallow: /*limit=
Disallow: /*?sort=
Disallow: /*&sort=
Disallow: /*?order=
Disallow: /*&order=
Disallow: /*?limit=
Disallow: /*&limit=
Disallow: /*&page
Disallow: /*?filter=
Disallow: /*&filter=
Disallow: /*filter_name=
Disallow: /*?filter_name=
Disallow: /*&filter_name=
Disallow: /*filter_sub_category=
Disallow: /*filter_description=
Disallow: /*?filter_sub_category=
Disallow: /*&filter_sub_category=
Disallow: /*?filter_description=
Disallow: /*&filter_description=
Disallow: /*?route=checkout/
Disallow: /*?route=account/
Disallow: /*?route=product/search
Disallow: /*?route=affiliate/
Disallow: /*?tracking=
Disallow: /*&tracking=
Disallow: /*route=account/
Disallow: /*route=affiliate/
Disallow: /*route=checkout/
Disallow: /*route=product/search
Disallow: /index.php?route=product/product*&manufacturer_id=
<?php
if (isset($_SERVER[’HTTP_USER_AGENT’]) && preg_match(’/yandex|mail\.ru|rambler/i’, $_SERVER[’HTTP_USER_AGENT’])) {
// Показываем содержимое файла для русскоязычных поисковых роботов
?>

Host: https://floraug.od.ua
Sitemap: https://floraug.od.ua/1_ya_sitemap.xml

<?php } else {
// Показываем содержимое файла для иностранных поисковых роботов
?>

Host: https://floraug.od.ua
Sitemap: https://floraug.od.ua/1_g_sitemap.xml

<?php }

Александр Окатьев

Здравствуйте, благодарю за ваш вариант.

ShawnBah
ShawnBah

12 ноября 2018, 02:00

????? ??? ? ????? ??? ?? ?? ???? ????? ?? ???? ??? ????, ??? ?? ?? ??? ?????.
https://audiojungle.net/item/christmas-piano/19056234

Ваш комментарий
адрес не будет опубликован
HTML-код не интерпретируется

Ctrl + Enter