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

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

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



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

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



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

PHP
<?php

class sitemapRegion {
    private $mainDomain;
    private $curDomain;
    private $curProtocol;
    private $sitemapDir;

    public function __construct()
    {
        $this->setCurDomain();
        $this->setCurProtocol();
    }

    private function setCurDomain()
    {
        $site = explode(":",$_SERVER["HTTP_HOST"])[0];
        $this->curDomain = $site;
    }

    private function setCurProtocol()
    {
        if ($this->isHttps()){
            $protocol = "https";
        } else {
            $protocol = "http";
        }

        $this->curProtocol = $protocol;
    }

    public function setMainDomain($mainDomain)
    {
        $this->mainDomain = $mainDomain;

        return $this;
    }

    public function setSitemapDir($sitemapDir)
    {
        $this->sitemapDir = $sitemapDir;

        return $this;
    }

    /* REQUEST_URI должен четко задаваться в .htaccess, тут он не проверяется */
    private function getSitemapPath()
    {
        return $_SERVER['DOCUMENT_ROOT'].rtrim($this->sitemapDir,'/').$_SERVER["REQUEST_URI"];
    }

    private function isHttps(): bool
    {
        return (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");
    }

    public function getSitemap()
    {
        $sitemapPath = $this->getSitemapPath();

        if (file_exists($sitemapPath)) {
            header('Content-Type: text/xml; charset=utf-8');
            $content = file_get_contents($sitemapPath);

            $content = str_ireplace($this->sitemapDir, '/', $content);

            if ($this->curDomain != $this->mainDomain) {
                $content = str_ireplace($this->mainDomain, $this->curDomain, $content);
                $content = preg_replace('/<loc>https?/', '<loc>'.$this->curProtocol, $content);
            }

            echo $content;

        } else {
            include $_SERVER['DOCUMENT_ROOT'] . "/404.php";
        }

    }
}

$originalHost = 'solverweb.ru'; //Заменить на свой
$sitemapDir = '/sm/'; //Заменить на свой
$sitemap = new sitemapRegion;
$sitemap->setMainDomain($originalHost)->setSitemapDir($sitemapDir)->getSitemap(); 

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

HTACCESS
RewriteEngine On

следующее:

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

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

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

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

Не получилось настроить?

Поможем с установкой, генерацией sitemap.xml, исключениями, CRON, мультидоменностью и нестандартными доработками под проект.