входим в Топ-20 агентств
Рейтинг Рунета

Полный справочник 301 редиректа

Все правила для .htaccess в одном месте: от редиректа одной страницы до переезда сайта. Каждый блок кода проверен на Apache 2.4 и открывается в нашей песочнице кнопкой «Проверить в песочнице» — можно подставить свой домен и сразу увидеть, куда уйдёт каждый адрес.

Часть 1 — Основные принципы и правила работы

Четыре железных правила перед тем, как начать:

Первое — от частных правил к общим. Apache читает файл сверху вниз и останавливается на первом сработавшем правиле с флагом L. Сначала редиректы конкретных страниц, потом правила для разделов, в конце — склейка зеркал и HTTPS. Иначе общее правило перехватит запрос раньше частного.

Второе — никаких цепочек. Каждый адрес должен попадать на конечную страницу за один редирект. Два редиректа подряд — это вдвое дольше для посетителя, лишние запросы для робота и размытые сигналы для поисковика. Поэтому в каждом правиле пишите сразу окончательный адрес: с https и главным зеркалом.

Третье — редиректы выше правил CMS. Почти любая CMS в конце .htaccess отправляет все несуществующие адреса на свой index.php. Правило, записанное ниже, до редиректа просто не дойдёт.

Четвёртое — браузер запоминает 301. После правки браузер может долго вести по старому редиректу. Проверяйте в режиме инкогнито, нашей проверкой цепочки редиректов или в Яндекс Вебмастере — а до загрузки на сервер в песочнице для .htaccess.

Перед любыми правилами mod_rewrite в файле должна быть строка:

RewriteEngine On

Без неё ни одно правило RewriteRule не работает. Строка RewriteEngine Off в любом месте выключает все правила файла.

Часть 2 — Полный справочник правил .htaccess

Правила удобно оборачивать в блок — тогда на сервере без mod_rewrite сайт не упадёт с ошибкой 500, правила просто не выполнятся:

<IfModule mod_rewrite.c>
RewriteEngine On

# … правила …

</IfModule>

Во всех примерах замените site.ru на свой домен. Новый адрес пишите полностью — с https и главным зеркалом, — тогда не будет второго редиректа.

2.1 — Редирект одной страницы на другую

Через RewriteRule (рекомендуем):

RewriteRule ^old-page/?$ https://site.ru/new-page/ [R=301,L]

В .htaccess шаблон сравнивается с адресом без ведущего слеша: для /old-page/ — это old-page/. /? в конце ловит адрес и со слешем, и без. Точки и другие спецсимволы экранируйте: ^old\.html$. UTM-метки и другие параметры перейдут на новый адрес сами.

Через Redirect (простая директива):

Redirect 301 /old-page/ https://site.ru/new-page/

Подходит, если в файле нет RewriteRule. У директивы две ловушки. Она срабатывает на всё, что начинается с указанного адреса: /old-page/ заберёт и /old-page/photo/. И она выполняется после правил mod_rewrite: если ниже стоит правило CMS «всё на index.php», к новому адресу прилипнет служебный параметр вроде ?q=old-page/. Если в файле уже есть RewriteRule — пишите редиректы тоже через RewriteRule.

2.2 — Склейка зеркал: www и без www

С www → без www (главное зеркало — без www):

RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

%1 — то, что попало в скобки условия, то есть домен без «www.». Правило работает для любого домена без правки.

Без www → с www (главное зеркало — с www):

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

В интернете часто встречается условие ^([^www].*)$ — оно ошибочное. [^www] означает «первая буква не w», поэтому правило не сработает для доменов на w: wildberries.ru, wb.ru, web-studio.ru.

2.3 — HTTP → HTTPS

Основной вариант:

RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

Вторую строку ставьте всегда. На многих хостингах (в том числе Beget) и с CDN (Cloudflare) HTTPS-соединение принимает nginx или прокси, а Apache получает запрос уже по HTTP — и %{HTTPS} всегда равен off. Без проверки заголовка X-Forwarded-Proto будет бесконечный редирект и ошибка ERR_TOO_MANY_REDIRECTS. Cloudflare тоже передаёт этот заголовок, отдельное правило с CF-Visitor не нужно.

HTTPS → HTTP (если отказываетесь от SSL):

RewriteCond %{HTTPS} on [OR]
RewriteCond %{HTTP:X-Forwarded-Proto} =https
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301,L]

Если на сайте был включён заголовок HSTS, браузеры, которые его запомнили, всё равно будут открывать сайт по https, пока не истечёт срок. Без серьёзной причины от HTTPS не отказывайтесь.

2.4 — Комбинированные редиректы без цепочек

Если поставить правила для HTTPS, www и слеша по отдельности, адрес http://www.site.ru/page пройдёт три редиректа. Чтобы любой вариант адреса попадал на конечный за один шаг, каждое правило сразу ведёт на окончательный адрес, а правило для слеша стоит первым.

Без www, HTTPS, слеш в конце (конечный вид: https://site.ru/page/):

# 1. Слеш в конце — сразу на https и главное зеркало
RewriteCond %{REQUEST_METHOD} !POST
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(\.[a-z0-9]{1,5}|/)$ [NC]
RewriteRule ^(.*)$ https://site.ru/$1/ [R=301,L]

# 2. www → без www
RewriteCond %{HTTP_HOST} ^www\.site\.ru$ [NC]
RewriteRule ^(.*)$ https://site.ru/$1 [R=301,L]

# 3. HTTP → HTTPS
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://site.ru/$1 [R=301,L]

Без www, HTTPS, без слеша в конце (конечный вид: https://site.ru/page):

# 1. Убрать слеш — сразу на https и главное зеркало
RewriteCond %{REQUEST_METHOD} !POST
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ https://site.ru/$1 [R=301,L]

# 2. www → без www
RewriteCond %{HTTP_HOST} ^www\.site\.ru$ [NC]
RewriteRule ^(.*)$ https://site.ru/$1 [R=301,L]

# 3. HTTP → HTTPS
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://site.ru/$1 [R=301,L]

Такой набор под ваш домен и CMS собирает генератор 301 редиректов и сразу показывает, сколько шагов будет для разных адресов.

2.5 — Слеш в конце адреса

Добавить слеш (site.ru/page → site.ru/page/):

RewriteCond %{REQUEST_METHOD} !POST
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(\.[a-z0-9]{1,5}|/)$ [NC]
RewriteRule ^(.*)$ https://site.ru/$1/ [R=301,L]

Условия защищают то, что ломать нельзя: существующие файлы, адреса с расширением (/robots.txt, /sitemap.xml, картинки) и отправку форм методом POST — при редиректе данные формы теряются. GET-параметры (?page=2) сохраняются сами: RewriteRule их не видит и не мешает.

Убрать слеш (site.ru/page/ → site.ru/page):

RewriteCond %{REQUEST_METHOD} !POST
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ https://site.ru/$1 [R=301,L]

!-d исключает настоящие папки на сервере: для них Apache сам добавит слеш обратно, и получится цикл.

2.6 — Склейка index.php и index.html

Все варианты одним правилом (/index.php, /catalog/index.html → адрес раздела):

RewriteCond %{THE_REQUEST} \s/[^?\s]*index\.(php|html?)[?\s] [NC]
RewriteRule ^(.*/)?index\.(php|html?)$ https://site.ru/$1 [R=301,L,NC]

Условие проверяет %{THE_REQUEST} — строку, которую прислал браузер. Она не меняется, когда CMS сама внутренне передаёт запрос на index.php. В интернете часто встречается вариант с RewriteCond %{REQUEST_URI} /index.php — на сайте с CMS он опасен: после внутренней подмены адреса REQUEST_URI становится /index.php, и редирект на главную срабатывает для всех страниц сайта.

Параметры при этом сохраняются: /index.php?n=1 → /?n=1.

2.7 — Редиректы с GET-параметрами

Динамический адрес → ЧПУ (site.ru/catalog.php?id=229 → site.ru/divany/):

RewriteCond %{QUERY_STRING} ^id=229$
RewriteRule ^catalog\.php$ https://site.ru/divany/? [R=301,L]

RewriteRule не видит часть адреса после «?», поэтому параметры проверяются условием. $ в конце условия обязателен: без него ^id=229 поймает и id=2290. Знак ? в конце нового адреса отбрасывает старые параметры. Без него получится /divany/?id=229, а если правило не привязано к конкретной странице (^.*$), — бесконечный редирект: новый адрес снова попадает под то же условие.

Убрать один параметр-дубль (/catalog/?page=1 → /catalog/):

RewriteCond %{QUERY_STRING} ^page=1$
RewriteRule ^(.*)$ https://site.ru/$1? [R=301,L]

Правило «убрать все параметры со всех страниц» (RewriteCond %{QUERY_STRING} .+) не используйте: вместе с мусором оно срежет UTM-метки, метки Директа и параметры фильтров — сломается аналитика и половина каталога.

2.8 — Смена домена

Каждая страница старого домена → такой же адрес нового:

RewriteCond %{HTTP_HOST} ^(www\.)?old-site\.ru$ [NC]
RewriteRule ^(.*)$ https://new-site.ru/$1 [R=301,L]

Условие по домену обязательно, если старый и новый домен смотрят в одну папку на хостинге: без него правило перенаправит и новый домен сам на себя. Если старый сайт лежит отдельно, условие тоже не помешает.

Все страницы старого домена → главная нового:

RewriteCond %{HTTP_HOST} ^(www\.)?old-site\.ru$ [NC]
RewriteRule ^ https://new-site.ru/? [R=301,L]

Так делать стоит, только если на новом сайте нет аналогов старых страниц. Поисковики считают массовый редирект на главную «мягкой 404» и не передают позиции внутренних страниц.

После переезда сообщите о нём поисковикам: в Яндекс Вебмастере — «Индексирование → Переезд сайта», в Google Search Console — «Изменение адреса».

2.9 — Своя страница 404 и удалённые страницы

ErrorDocument 404 /404.php

Пишите путь от корня, а не полный адрес. С ErrorDocument 404 https://site.ru/404.php сервер отдаст не код 404, а редирект — и поисковик будет считать несуществующие страницы рабочими.

Страница удалена навсегда и замены нет (код 410):

RewriteRule ^old-promo/?$ - [G]

Перенаправлять удалённые страницы на главную не нужно: поисковики считают это «мягкой 404». Если есть близкая по смыслу страница — ведите на неё, если нет — пусть страница честно отдаёт 404 или 410.

2.10 — Пример готового .htaccess

Рабочий шаблон для сайта на CMS: без www, HTTPS, слеш в конце. Любой адрес попадает на конечный за один редирект.

Options -Indexes
ErrorDocument 404 /404.php

<IfModule mod_rewrite.c>
RewriteEngine On

# 1. Конкретные страницы (сначала частные правила)
RewriteRule ^old-page/?$ https://site.ru/new-page/ [R=301,L]

# 2. index.php и index.html — на адрес раздела
RewriteCond %{THE_REQUEST} \s/[^?\s]*index\.(php|html?)[?\s] [NC]
RewriteRule ^(.*/)?index\.(php|html?)$ https://site.ru/$1 [R=301,L,NC]

# 3. Слеш в конце
RewriteCond %{REQUEST_METHOD} !POST
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(\.[a-z0-9]{1,5}|/)$ [NC]
RewriteRule ^(.*)$ https://site.ru/$1/ [R=301,L]

# 4. www → без www
RewriteCond %{HTTP_HOST} ^www\.site\.ru$ [NC]
RewriteRule ^(.*)$ https://site.ru/$1 [R=301,L]

# 5. HTTP → HTTPS
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://site.ru/$1 [R=301,L]

# 6. Правила CMS — всегда в конце
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
</IfModule>

Часть 3 — Особенности 1С-Битрикс

У Битрикса свой .htaccess с правилами из коробки. Вносить изменения нужно аккуратно, не ломая встроенную логику.

Где размещать правила. В стандартном файле есть блок <IfModule mod_rewrite.c>. Свои правила добавляйте сразу после строки RewriteEngine On внутри него — выше строк с bitrix/urlrewrite.php.

HTTPS и без www одним редиректом, обмен с 1С не трогаем:

RewriteRule ^bitrix/admin/1c_exchange\.php$ - [L]

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

RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://site.ru/$1 [R=301,L]

Первая строка исключает файл обмена с 1С: если 1С обращается к сайту по http, редирект может сорвать выгрузку товаров и заказов.

В интернете часто встречается вариант с флагом [R,L] — это временный редирект 302, а не 301, на любом хостинге. Для переезда на HTTPS нужен [R=301,L].

Редирект конкретной страницы:

RewriteRule ^old-section/old-page/?$ https://site.ru/new-section/new-page/ [R=301,L]

Редирект раздела целиком:

RewriteRule ^old-catalog/(.*)$ https://site.ru/new-catalog/$1 [R=301,L]

Что проверить в админке Битрикса. В настройках сайта (Настройки → Настройки продукта → Сайты → Список сайтов) должен быть указан домен главного зеркала. Ссылки в шаблоне, меню и компонентах должны вести сразу на https-адреса без www — иначе каждый клик по сайту будет проходить через редирект. Редиректы можно вести и в интерфейсе — с помощью модулей из Маркетплейса, — но правила в .htaccess срабатывают раньше, до запуска PHP, и не зависят от обновлений модулей.

Часть 4 — PHP, nginx и другие платформы

PHP

<?php
header("Location: https://site.ru/new-page/", true, 301);
exit;

Условный редирект для конкретного адреса:

<?php
if (parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) === '/old-page.php') {
    header("Location: https://site.ru/new-page/", true, 301);
    exit;
}

Заголовки отправляются до любого вывода на страницу: ни пробела, ни echo до header(). parse_url отрезает параметры, иначе адрес с UTM-меткой не совпадёт.

nginx

На сервере только с nginx файл .htaccess не читается — правила пишутся в конфигурации сайта. После правки проверьте синтаксис командой nginx -t и перезагрузите nginx.

HTTP → HTTPS для всех вариантов домена:

server {
    listen 80;
    server_name site.ru www.site.ru;
    return 301 https://site.ru$request_uri;
}

www → без www по HTTPS:

server {
    listen 443 ssl;
    server_name www.site.ru;
    # ssl_certificate и ssl_certificate_key — как у основного домена
    return 301 https://site.ru$request_uri;
}

Редирект страницы — внутри основного блока server:

rewrite ^/old-page/?$ https://site.ru/new-page/ permanent;

Отдельные блоки server для зеркал работают быстрее и надёжнее, чем if ($host = …) внутри основного. Код для nginx по вашим настройкам собирает генератор — вкладка «nginx».

WordPress — плагины

ПлагинОсобенности
RedirectionСамый популярный: журнал 404, регулярные выражения, статистика переходов
Safe Redirect ManagerЛёгкий, поддерживает регулярные выражения
Simple 301 RedirectsПростой список «старый → новый», без регулярных выражений
Quick Page/Post RedirectРедирект настраивается прямо в редакторе записи

Плагины срабатывают только после загрузки WordPress. Для склейки зеркал, HTTPS и массовых правил .htaccess надёжнее и быстрее. Свои правила ставьте выше строки # BEGIN WordPress: блок между BEGIN и END WordPress перезаписывает сам.

OpenCart

Правила ставьте после RewriteBase /, выше правил SEO-адресов OpenCart:

RewriteRule ^old-category/old-page\.html$ https://site.ru/new-page/ [R=301,L]

Joomla

Встроенный компонент «Перенаправления» (Компоненты → Перенаправления) позволяет добавлять редиректы в интерфейсе и показывает битые ссылки. Через .htaccess правила ставьте после RewriteEngine On, выше раздела «Begin — Joomla! core SEF Section». Например, убрать index.php из адресов:

RewriteCond %{THE_REQUEST} \s/[^?\s]*index\.(php|html?)[?\s] [NC]
RewriteRule ^(.*/)?index\.(php|html?)$ https://site.ru/$1 [R=301,L,NC]

Часть 5 — Справочник синтаксиса .htaccess

Директивы

ДирективаНазначениеПример
RewriteEngineВключить mod_rewrite. Без On ни одно RewriteRule не работаетRewriteEngine On
RewriteBaseК чему приписывать относительные адреса в правилахRewriteBase /
RewriteCondУсловие для ближайшего RewriteRule нижеRewriteCond %{HTTPS} off
RewriteRuleПравило: шаблон, новый адрес, флагиRewriteRule ^old/?$ /new/ [R=301,L]
RedirectПростой редирект (mod_alias), срабатывает на адрес и всё «внутри» негоRedirect 301 /old/ https://site.ru/new/
RedirectMatchРедирект по регулярному выражению (mod_alias), путь — со слешемRedirectMatch 301 ^/old/(.*)$ https://site.ru/new/$1
ErrorDocumentСвоя страница ошибки — путь от корняErrorDocument 404 /404.php

Серверные переменные (в RewriteCond и в новом адресе)

ПеременнаяЧто содержит
%{HTTP_HOST}Домен запроса: www.site.ru
%{REQUEST_URI}Путь со слешем, без параметров: /page/. После внутренней подмены адреса CMS — уже новый путь
%{QUERY_STRING}Только параметры, без «?»: id=1&utm_source=yandex
%{THE_REQUEST}Исходная строка запроса: GET /page/?id=1 HTTP/1.1. Не меняется при внутренних подменах
%{HTTPS}on или off. За nginx-прокси и CDN всегда off
%{HTTP:X-Forwarded-Proto}Протокол, по которому посетитель пришёл к прокси или CDN: https или http. Так же читается любой заголовок: %{HTTP:Имя}
%{SERVER_PORT}Порт: 80 или 443. За прокси обычно 80
%{REQUEST_FILENAME}Путь к файлу на диске — для проверок -f и -d
%{REQUEST_METHOD}GET, POST… Формы лучше не перенаправлять
%{HTTP_USER_AGENT}Браузер или робот: YandexBot, Googlebot
%{REMOTE_ADDR}IP посетителя (за прокси — IP прокси)
%{ENV:REDIRECT_STATUS}Пусто при первом проходе, 200 — после внутренней подмены. Защита от зацикливания

Флаги RewriteRule

ФлагРасшифровкаНазначение
R=301RedirectПостоянный редирект — для переездов, склейки, HTTPS
R=302 / RRedirectВременный редирект. Флаг R без кода — тоже 302
LLastДальше правила в этом проходе не проверять
ENDEndОстановить всё, включая повторный проход после внутренней подмены
NCNo CaseБез учёта регистра букв
QSAQuery String AppendДописать старые параметры, если в новом адресе есть свои «?…»
QSDQuery String DiscardВыбросить старые параметры (то же, что «?» в конце адреса)
NENo EscapeНе кодировать спецсимволы — для #якорей и готовых %D0%B0
FForbiddenОтвет 403, адрес пишут «-»
GGoneОтвет 410 — страница удалена навсегда
S=nSkipПропустить n следующих правил
PTPass ThroughПередать адрес дальше другим модулям (Alias и т. п.)

Флаги пишутся в квадратных скобках через запятую без пробелов: [R=301,L], [R=301,L,NC].

Флаги RewriteCond

ФлагНазначение
[NC]Сравнение без учёта регистра
[OR]«Или» со следующим условием (по умолчанию условия объединяются через «и»)
[NV]Не добавлять заголовок Vary в ответ, когда условие проверяет заголовок запроса

Регулярные выражения

СимволЗначениеПример
.Любой один символa.c — abc, aXc
.*Любая последовательность символов.*\.html
^Начало строки^page (в RewriteRule — без слеша)
$Конец строкиpage/$
?Предыдущий символ 0 или 1 разpage/? — со слешем и без
*0 или больше разa*
+1 или больше раз\d+
[abc]Один символ из набора[0-9], [a-z]
[^abc]Любой символ, кроме перечисленных[^/] — всё, кроме слеша
(...)Группа — результат подставляется как $1, $2…^blog/(.*)$
(?:...)Группа без запоминания — не сбивает нумерацию^(?:www\.)?site\.ru$
a|bИли(php|html)
\Экранирование спецсимвола\. — точка, \ — пробел
\d / \w / \sЦифра / буква, цифра или _ / пробельный символ\d{4} — четыре цифры
{n,m}От n до m повторов[A-Z]{3,9}

Обратные ссылки

СсылкаГде используетсяЧто содержит
$1, $2…В новом адресе и в условияхГруппы из шаблона RewriteRule
%1, %2…В новом адресе и в следующих условияхГруппы из последнего сработавшего RewriteCond
%{ИМЯ}ВездеЗначение серверной переменной

Пример с %1 — склейка www без указания домена:

# %1 — домен без www из условия ниже
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

Комментарий пишите только на отдельной строке. Строка RewriteCond %{HTTP_HOST} ^www\.(.+)$ # комментарий — ошибка: Apache примет «#» за флаги, и весь сайт отдаст 500.

Операторы сравнения в RewriteCond

ОператорНазначение
(без оператора)Регулярное выражение
!Отрицание: условие выполнено, если НЕ совпадает
=Точное равенство строк; ="" — пустая строка
!=Не равно
<, >, <=, >=Сравнение строк по алфавиту
-f / !-fФайл существует / не существует
-d / !-dПапка существует / не существует
-sФайл существует и не пустой
-lСимволическая ссылка

Все директивы, флаги и переменные с примерами и кнопкой «Вставить» — в справочнике песочницы для .htaccess.

Часть 6 — Диагностика и типичные ошибки

Чем проверить

ИнструментДля чего
Проверка .htaccess онлайнДо загрузки на сервер: какая строка сработает для каждого адреса, цепочки, циклы, ошибки 500
Проверка цепочки редиректовЖивой сайт: все шаги и коды ответа так, как их видят роботы Яндекса и Google
Проверка HTTP-заголовковКод ответа, заголовки, кэширование и время отклика страницы
Яндекс Вебмастер → Инструменты → Проверка ответа сервераКак адрес видит робот Яндекса
Google Search Console → Проверка URLКак адрес видит Google
Команда curl -I -L http://site.ru/pageЦепочка редиректов в терминале

Типичные ошибки

ERR_TOO_MANY_REDIRECTS — бесконечный редирект. Чаще всего это переход на HTTPS за прокси или CDN без условия X-Forwarded-Proto, или один и тот же редирект включён дважды: в .htaccess и в панели хостинга, CMS или Cloudflare.

302 вместо 301 — в правиле стоит [R,L] или [R] без кода. Всегда пишите [R=301,L].

Редирект не работает совсем — нет строки RewriteEngine On; правило стоит ниже правил CMS; шаблон начинается со слеша (^/old-page$ в .htaccess не сработает); на сервере только nginx, и .htaccess не читается.

Ошибка 500 на всём сайте — опечатка в файле: комментарий в одной строке с правилом без флагов, пробел в шаблоне без \, неизвестный флаг. Песочница покажет строку с ошибкой.

Цепочка редиректов — правила для HTTPS и www стоят отдельно и ведут на промежуточный адрес. Пишите в каждом правиле окончательный адрес (см. раздел 2.4).

Редирект на нерелевантную страницу — поисковик считает это «мягкой 404». Ведите на близкую по смыслу страницу или отдавайте 404/410.

robots.txt — при склейке зеркал и переезде на HTTPS файл перенаправляется вместе с сайтом, это нормально. Ошибка — когда robots.txt с главного зеркала уходит на HTML-страницу или отдаёт 404.

Не обновили внутренние ссылки — после редиректа замените старые адреса в меню, шаблонах, sitemap.xml и рекламе. Редирект — страховка для внешних ссылок и закладок, а не замена правильным ссылкам.

Длинные цепочки — Google проходит до 10 шагов, но каждый шаг замедляет переобход и открытие страницы. Цель — один редирект со старого адреса на конечный.