В процессе работы над улучшением одного клиентского интернет-магазина мы столкнулись с задачей создания динамических поддоменов, что, как вы, надеюсь, догадались, привело к необходимости в динамических файлах sitemap.xml и robots.txt. Казалось бы, всё довольно просто: немного кода, призыв к доске с маркерами и порция кофе – и вот она, волшебная карта сайта, готовая к отправке в духовные дали поисковых систем. Но тут-то все и начались "Но".
Первое и, пожалуй, самое важное "Но". Управление поддоменами у нас происходило через инфоблок, а значит, в любой момент я мог оказаться в ситуации, когда надо дергать различные списки и подыскивать подходящий поддомен, чтобы составить для него карту.
И вот, второй момент. Опасность "засорения" корневого каталога кучей файлов. Вы только представьте: у нас в корне вместе с обычными файлами лежит целая свора sitemap.xml и robots.txt на каждый поддомен. Чистота должна быть в нашем коде, как в квартире у бабушки – ни одного лишнего мусора и только еловые угли! 🧹
Но, как это часто бывает, решение оказалось довольно простым, и в некотором роде даже элегантным, будто пьеса Шекспира, где всё сводится к трём словам: "мы нашли выход".
Первым шагом мы добавили правила в конфигурацию nginx (начинаем подмигивать шутникам-системным администраторам):
rewrite ^/sitemap.xml /dinamic-map.php last; rewrite ^/robots.txt /dinamic-robot.php last;
Это означает, что при запросе к файловой карте сайта мы передаем управление на dinamic-map.php, а при запросе к robots.txt – к dinamic-robot.php. Всё как в хорошем фильме, где каждая деталь на своём месте.
Далее — в файлах dinamic-map.php и dinamic-robot.php нам оставалось всего лишь использовать одну простую функцию PHP: str_replace, которая работает, как волшебная палочка для замены строк.
Содержимое dinamic-map.php выглядит так:
$url = $_SERVER['REQUEST_URI']; $path = parse_url($url, PHP_URL_PATH); $pathParts = explode('/', $path); $lastPart = array_pop($pathParts); $files = $_SERVER['DOCUMENT_ROOT'].'/'.$lastPart; $line = file_get_contents($files); $line = str_replace("sgb.su", $_SERVER["HTTP_HOST"], $line); // здесь меняем на свой домен header('Content-Type: text/xml; charset=utf-8'); echo $line;
Здесь мы мудро получаем текущий URI запроса, парсим его, извлекаем последние части и устанавливаем путь к нужному файлу. После чего, при помощи str_replace, меняем наш старый домен на хитроумный $_SERVER["HTTP_HOST"], и, о чудо, всё начинает работать, как по расписанию!
А теперь, динамический robots.txt – он в file dinamic-robot.php:
$files = $_SERVER['DOCUMENT_ROOT'].'/robots.txt'; $line = file_get_contents($files); $line = str_replace("sgb.su", $_SERVER["HTTP_HOST"], $line); // здесь меняем на свой домен header('Content-Type: text/html; charset=utf-8'); echo nl2br($line);
Процесс здесь схожий: используем тот же str_replace, меняя старую лямку на новую, и добавляем необходимые заголовки.
В итоге, мы получили не просто динамические поддомены, но и динамически создаваемые файлы карт сайта и robots.txt! Вуаля! 🎩✨ Как-то так, мы, как настоящие волшебники кода, сделали рутинную задачу увлекательной и живой. Работа, как всегда, горела в хорошем смысле этого слова, а мы можем гордо смотреть в будущее, зная, что наш интернет-магазин теперь на высоте!