Редирект sitemap.xml для поддоменов: пошаговая настройка .htaccess

    При управлении многосайтовой структурой часто возникает задача перенаправить файл sitemap.xml каждого поддомена в отдельную папку. Однако при использовании универсального правила можно случайно затронуть основной домен. В этой статье мы разберём, как настроить редирект для поддоменов, исключив основной домен, и избежать ошибок в конфигурации Apache.

    Проблема: редирект sitemap.xml затрагивает основной домен

    Исходная задача: для поддоменов вида subdomain1.example.com нужно перенаправлять запросы sitemap.xml в /seo_sitemap/subdomain1/sitemap.xml. Используется правило в .htaccess:

    RewriteCond %{HTTP_HOST} ^(?!www\.)([^.]+) [NC]
    RewriteRule ^sitemap\.xml$ /seo_sitemap/%1/sitemap.xml [L,NC]

    Но это правило также срабатывает для основного домена example.com, так как он соответствует условию ^(?!www\.)([^.]+) - извлекается подстрока example, и происходит редирект в /seo_sitemap/example/sitemap.xml, что нежелательно.

    Решение: как исключить основной домен

    Чтобы редирект применялся только к поддоменам, а основной домен обрабатывался отдельно, нужно добавить дополнительное условие, исключающее конкретное имя домена. Например, если основной домен - example.com, используйте:

    RewriteCond %{HTTP_HOST} !^example\.com [NC]
    RewriteCond %{HTTP_HOST} ^(?!www\.)([^.]+) [NC]
    RewriteRule ^sitemap\.xml$ /seo_sitemap/%1/sitemap.xml [L,NC]

    Первая строка (RewriteCond %{HTTP_HOST} !^example\.com [NC]) проверяет, что запрос идёт не с основного домена. Если условие истинно, выполняется второе условие и правило. Таким образом, для example.com/sitemap.xml редирект не сработает.

    Альтернативный подход: редирект для основного домена отдельно

    Если нужно, чтобы основной домен тоже перенаправлял sitemap.xml, но в другую директорию (например, в /seo_sitemap/sitemap.xml), добавьте два правила:

    # Правило для основного домена
    RewriteCond %{HTTP_HOST} ^example\.com [NC]
    RewriteRule ^sitemap\.xml$ /seo_sitemap/sitemap.xml [L,NC]
    
    # Правило для поддоменов
    RewriteCond %{HTTP_HOST} !^example\.com [NC]
    RewriteCond %{HTTP_HOST} ^(?!www\.)([^.]+) [NC]
    RewriteRule ^sitemap\.xml$ /seo_sitemap/%1/sitemap.xml [L,NC]

    Порядок правил важен: сначала обрабатывается более специфичное условие для основного домена, затем - для поддоменов. Флаг L останавливает дальнейшую обработку, если правило сработало.

    Проверка и отладка конфигурации

    После внесения изменений в .htaccess обязательно проверьте работу редиректов:

    • Для основного домена: curl -I https://example.com/sitemap.xml - должен вернуть 200 или 301 в зависимости от вашей цели.
    • Для поддоменов: curl -I https://subdomain1.example.com/sitemap.xml - должен перенаправлять в /seo_sitemap/subdomain1/sitemap.xml.

    Также убедитесь, что файлы в целевых директориях существуют, иначе сервер вернёт 404. Если редирект не срабатывает, проверьте, включён ли модуль mod_rewrite (часто используется RewriteEngine On в начале .htaccess).

    Распространённые ошибки и их исправление

    Ошибка: редирект для поддоменов не работает. Причина: неправильный порядок правил или конфликт с другими RewriteCond. Решение: разместите правило для поддоменов после правил для основного домена или используйте флаг L для остановки обработки.

    Ошибка: бесконечный цикл редиректа. Причина: целевой URL также соответствует правилу. Решение: убедитесь, что целевой путь не начинается с sitemap.xml или добавьте условие RewriteCond %{REQUEST_URI} !^/seo_sitemap/.

    Ошибка: редирект для www-поддоменов. Если у вас есть www.subdomain1.example.com, условие ^(?!www\.)([^.]+) исключит www. Для обработки www-поддоменов добавьте отдельное правило или измените регулярное выражение.

    Часто задаваемые вопросы