Переадресация через htaccess нужна, когда домен (или страницы) переезжают на новое место, а трафик и позиции не хочется терять. Чаще всего используют постоянный редирект 301: сервер отвечает, что адрес переехал навсегда, и дальше запросы направляются на новый домен.

Ниже - рабочие варианты именно для Apache и файла .htaccess.


Когда 301 действительно нужен

Используйте редирект, если:

  • сайт переехал на другой домен
  • сменили основное зеркало (например, было www, стало без www)
  • меняется протокол (http <-> https)
  • нужно убрать из поиска старые URL, которые теперь ведут на новый адрес

Для временных переносов нужен другой подход (302/303), но для переезда обычно используют 301.


Важно перед правками htaccess

  1. Делайте копию текущего .htaccess (или сначала создайте резерв, если файла нет).
  2. Пишите правило так, чтобы оно срабатывало один раз. Несколько подряд редиректов - лишняя нагрузка и чаще ошибки.
  3. Кириллические домены добавляйте в Punycode (например, .рф и .рус - тоже требуют перевода).

Самый частый случай: переадресация всего домена на новый домен

Постоянно перекинуть все запросы со старого домена на новый можно так.

Вариант на RewriteRule (универсально)

Разместите в .htaccess на старом домене:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^old-domain\.ru$ [NC]
RewriteRule ^(.*)$ http://new-domain.ru/$1 [R=301,L]

Замените:
- old-domain.ru - старый домен
- new-domain.ru - новый домен
- http:// при необходимости замените на https://


Быстрые варианты для доменных зеркал (www / без www)

С www на без www (главное зеркало - без www)

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.ru$ [NC]
RewriteRule ^(.*)$ http://example.ru/$1 [R=301,L]

С без www на www (главное зеркало - с www)

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example\.ru$ [NC]
RewriteRule ^(.*)$ http://www.example.ru/$1 [R=301,L]

Подмножества: когда нужно перенаправить все, кроме одной страницы

Так бывает при технических страницах (например, админка, healthcheck, отдельный файл).

Пример: переадресовывать всё, кроме /login.php

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/login\.php$
RewriteRule ^(.*)$ https://new-domain.ru/$1 [R=301,L]

Если старый домен в HTTP, а новый в HTTPS

Обычно удобнее редирект сделать на новом этапе переезда, но если на старом нужно сразу переводить на HTTPS - используйте вариант:

RewriteEngine On
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

Правильно выбрать правило: шпаргалка по сценариям

Что нужно сделать Где разместить .htaccess Готовый шаблон (суть)
Весь старый домен перекинуть на новый в корне старого сайта RewriteCond %{HTTP_HOST} ^old$ + RewriteRule ^(.*)$ new/$1 [R=301,L]
www -> без www на старом домене RewriteCond %{HTTP_HOST} ^www\. + RewriteRule ... http://example/$1
без www -> www на старом домене RewriteCond %{HTTP_HOST} ^example\.ru$ + RewriteRule ... http://www.example/$1
Все страницы перекинуть на новый домен, кроме одной на старом домене RewriteCond %{REQUEST_URI} !^/page$ + RewriteRule ... new/$1
http -> https (на старом или зеркале) на домене в HTTP редирект на https://%{HTTP_HOST}/$1 с R=301
Кириллический домен в правилах, куда подставляете домен домен должен быть в Punycode

Как протестировать, что редирект работает

  1. Откройте старый URL в браузере и проверьте конечный адрес (главное - чтобы путь совпадал: /some/page не “прыгал”).
  2. Проверьте несколько страниц, включая главную /.
  3. Если редирект “крутится” по кругу (циклическая переадресация), дело обычно в конфликте правил http/https или www/без www. В таких случаях правят условия RewriteCond %{HTTPS} и/или заголовки про протокол.

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


Частые ошибки, из-за которых редирект не срабатывает

  • Правило добавлено не в тот .htaccess (нужно именно на старый домен).
  • Не включен RewriteEngine On.
  • В правилах перепутаны домены местами.
  • Подставили “сырой” кириллический домен вместо Punycode.
  • Правило перехватывает не тот хост/не тот путь (ошибка в RewriteCond).
  • Создали цепочку: A -> B -> A или A -> B -> C (вместо одного перенаправления).

Итог

Чтобы переадресовать сайт с одного домена на другой через htaccess, обычно достаточно одного 301 редиректа: ограничить по HTTP_HOST, а дальше перенаправить все пути через RewriteRule ^(.*)$ new/$1 [R=301,L]. Дальше уже точечно добавляют исключения (конкретные страницы) и приводят доменные зеркала (www/без www, http/https) к одному “главному” варианту.