Редирект 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-поддоменов добавьте отдельное правило или измените регулярное выражение.