Карты отличаются только доменом (более сложный способ)

Часто бывает так, что карта должна отличаться только доменом, при этом доменов могут быть сотни и они могут каждый день добавляться или удаляться. Следить за этим вручную крайне непросто, да и не нужно.

Создаем и настраиваем обычную карту сайта на основной домен, прописываем ей путь /sitemap/sitemap, как показано на скрине.



Заходим на фтп, и удаляем из корня все файлы по маске sitemap*.xml (если их не удалить, в некоторых случаях может не работать).

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



Создаем файл sitemapController.php в корне сайта, меняем первую строку на Ваш домен, прописанный в настройках карты сайта:

<?php
$mainDomain = 'https://solverweb.ru'; //Заменить на свой
 
$host = htmlspecialchars($_SERVER['SERVER_NAME']);
if(strpos($_SERVER["REQUEST_URI"],'../') !== false) die('');
 
if ((isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on") || (isset($_SERVER["HTTP_X_FORWARDED_PROTO"]) && $_SERVER["HTTP_X_FORWARDED_PROTO"] == "https") || (isset($_SERVER["HTTP_X_FORWARDED_SCHEME"]) && $_SERVER["HTTP_X_FORWARDED_SCHEME"] == "https")){
	$protocol = "https";
}
else{
	$protocol = "http";
}
 
 
$curDomain = $protocol."://".$host;
 
$sitemapsPath = '/sitemaps/www';
$path = $_SERVER['DOCUMENT_ROOT'] . $sitemapsPath . $_SERVER["REQUEST_URI"];
 
if (file_exists($path))
{
	header('Content-Type: text/xml; charset=utf-8');
	$current = file_get_contents($path);
	$current = str_ireplace($mainDomain, $curDomain, $current);
	echo $current;
}else {
	include $_SERVER['DOCUMENT_ROOT']. "/404.php";
}

Если у Вас Apache, вносите в .htaccess после

RewriteEngine On

следующее:

RewriteRule ^sitemap(.*).xml$ /sitemapController.php [L]

Если у Вас nginx, вносите в server {} (пожалуйста, убедитесь что у Вас хватает компетенции, если нет, пишите нам, не нужно ломать сервер)

location / {
    rewrite ^/sitemap(.*).xml$ /sitemapController.php break;
}

На этом все. Если разобраться не получается, не отчаивайтесь, пишите в поддержку, мы поможем.