- Когда 301 действительно нужен
- Важно перед правками htaccess
- Самый частый случай: переадресация всего домена на новый домен
- Быстрые варианты для доменных зеркал (www / без www)
- Подмножества: когда нужно перенаправить все, кроме одной страницы
- Если старый домен в HTTP, а новый в HTTPS
- Правильно выбрать правило: шпаргалка по сценариям
- Как протестировать, что редирект работает
- Частые ошибки, из-за которых редирект не срабатывает
- Итог
Переадресация через htaccess нужна, когда домен (или страницы) переезжают на новое место, а трафик и позиции не хочется терять. Чаще всего используют постоянный редирект 301: сервер отвечает, что адрес переехал навсегда, и дальше запросы направляются на новый домен.
Ниже - рабочие варианты именно для Apache и файла .htaccess.
Когда 301 действительно нужен
Используйте редирект, если:
- сайт переехал на другой домен
- сменили основное зеркало (например, было www, стало без www)
- меняется протокол (http <-> https)
- нужно убрать из поиска старые URL, которые теперь ведут на новый адрес
Для временных переносов нужен другой подход (302/303), но для переезда обычно используют 301.
Важно перед правками htaccess
- Делайте копию текущего .htaccess (или сначала создайте резерв, если файла нет).
- Пишите правило так, чтобы оно срабатывало один раз. Несколько подряд редиректов - лишняя нагрузка и чаще ошибки.
- Кириллические домены добавляйте в 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 |
Как протестировать, что редирект работает
- Откройте старый URL в браузере и проверьте конечный адрес (главное - чтобы путь совпадал:
/some/pageне “прыгал”). - Проверьте несколько страниц, включая главную
/. - Если редирект “крутится” по кругу (циклическая переадресация), дело обычно в конфликте правил 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) к одному “главному” варианту.