Иногда оптимизатору ставится задача реализации внутренней SEO на сайте, обслуживающем несколько доменов (например, филиалы организации в разных городах, у каждого филиала свой домен). В этой статье я покажу, как с помощью парочки PHP-фокусов реализовать подобный функционал на любой CMS.

Дисклеймер! Если пугают слова PHP и Nginx, лучше не читать эту статью, а заказать создание сайта веб-студии, которая имеет опыт в seo продвижении сайтов, чтобы необходимые меры оптимизации были внедрены ими сразу же.

А если ты смелый, ловкий и умелый, то аккуратно выполняй предложенные ниже рекомендации, не забывая адаптировать фрагменты кода под уникальную структуру собственного проекта.

Итак, нам потребуется, чтобы robots.txt и sitemap.xml отображали ссылки с тем доменом, на который зашёл посетитель. Сейчас на большинстве веб-серверов за отдачу статики отвечает Nginx, и в его конфиг я и предлагаю внести изменения. На примере обработки robots.txt, предлагаю добавить такое правило:

location = /robots.txt { rewrite ^ /robots.php last; }

Благодаря которому при запросе robots.txt контент будет динамически генерироваться файлом robots.php. А вот и содержимое этого файла:

<?php
if (strpos($_SERVER['REQUEST_URI'], 'robots.php') === 1) {
    header('Location: /robots.txt');
    die;
}
header('Content-Type: text/plain; charset=utf-8');
$domain = $_SERVER['HTTP_HOST'];
$d = <<<ROBOTS
User-Agent: *
Disallow: /wp-admin
Sitemap: https://$domain/sitemap.xml
ROBOTS;
echo $d;

Здесь мы при запросе robots.php редиректим на robots.txt (не обязательно, но почему бы и нет). Затем отправляем заголовок «Content-Type: text/plain» (по умолчанию ведь PHP отдаёт html-контент, а нам нужен plain text). Затем записываем домен, на который произошёл запрос, в переменную $domain и подставляем дальше эту переменную в том месте текста, где нужно показать домен.

Точно такой же фокус можно провернуть с sitemap.xml, настроив на отображение карты сайта sitemap.php. Возможно, ваша CMS умеет генерировать файл sitemap.xml, но домен у всех ссылок будет базовый, не зависимо от домена в запросе. Решим этот вопрос в файле sitemap.php (для которого не забываем настроить правило в Nginx):

<?php
$d = file_get_contents('sitemap.xml');
echo preg_replace('~://[^/]+/~', '://'.$domain.'/', $d);

Т.е. читаем сгенерированный движком файл sitemap.xml и динамически заменяем домен в ссылках на $domain, которую определяем как в предыдущем примере.

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

<?php
$city = [
'msk.ru' => 'Москва',
'spb.ru' => 'Питер'
];
$d = file_get_contents('header.tpl');
echo str_replace('[город]', $city[$domain], $d);

Тогда в шаблоне header.tpl достаточно будет написать текст, например: "Куплю дорого в г.[город]", и текст [город] динамически заменится на «Москва» или «Питер» в зависимости от домена в запросе.

Владея такими простыми трюками можно реализовать сайт на одном движке с одной базой, шаблоном и контентом, который будет работать на несколько доменов. Вот пример реального коммерческого воплощения описанных фокусов. По ссылке технический домен, который показывает список филиалов организации, расположенных на разных доменах. Там есть ещё нюансы, например, с ssl-сертификатом... Задавай вопросы, и получишь ответы.

Запись опубликована 2 июня 2021 года. Кто-то говорил, что я мало пишу в рубрику «SEO», так читайте же:

Подписка на RSS канал блога RSS подписка (как это?) поможет вам не пропустить ничего интересного на этом блоге.