301 редирект используют, когда нужно передать новой странице весь накопленный старой страницей ссылочный вес. Например, когда нужно перенести сайт с одного домена на другой или поменять URL страницы в рамках одного домена.

В этой статье разбираемся, как настроить редирект 301: в .htaccess, в панели управления хостингом или в консоли WordPress. Также вы узнаете, в каких ситуациях не стоит использовать 301 редирект и как исправить типичные ошибки при его настройке.

Содержание

  1. В каких ситуациях используется 301 редирект
  2. В каких ситуациях 301 редирект лучше не использовать
  3. Как сделать 301 редирект в .htaccess
  4. Как составить свою команду для редиректа в .htaccess
  5. Как сделать редирект 301 в панели управления cPanel
  6. Плагины для настройки 301 редиректа в WordPress
  7. Распространённые проблемы с 301 редиректам

В каких ситуациях используется 301 редирект

  1. Перенос сайта на новый домен. Например, вы нашли более подходящий домен для сайта и хотите, чтобы при переходе на любую страницу со старым доменом в URL открывалась такая же страница, но с новым доменом.
  2. Перенос раздела сайта с поддомена в подпапку. Например, у вашего блога был адрес blog.vashdomen.com, но вы решили перенести его на адрес vashdomen.com/blog/.
  3. Смена URL-адреса страницы. Например, предыдущий URL страницы слишком длинный и вы хотите сделать его более читабельным.
  4. Устранение дубликатов страниц. Для поисковиков URL-адреса с WWW и без WWW / с HTTP на HTTPS / с косой чертой в конце и без неё — это разные адреса. Правильно будет выбрать какой-то один вариант и сделать на него 301 редирект со всех других.
  5. Покупка дополнительного домена. Допустим вы купили такой домен, как и у основного сайта, но в другой зоне. Залить на него копию сайта будет неправильно, это создаст дубликат сайта в поисковой выдаче. Правильно будет выбрать главный домен, а с остальных настроить на него 301 редирект.
  6. Удаление ранее существовавшей страницы. Когда вы удаляете страницу на сайте, на неё ещё какое-то время продолжает идти трафик. Чтобы не терять его, стоит сделать 301 редирект на страницу с похожим контентом.

В каких ситуациях 301 редирект лучше не использовать

  1. Проведение A/B теста. Например, вы сделали несколько вариантов одной из страниц и планируете перенаправлять разные группы пользователей на разные версии. Чтобы не потерять позиции основной страницы, стоит использовать для таких целей редирект 302.
  2. Продукта временно нет в наличии. Если в такой ситуации вы решаете перенаправлять посетителей на страницу с похожим товаром или страницу, где говорится, когда товар снова появится, правильно будет сделать это при помощи редиректа 302.
  3. Редизайн страницы. Допустим у вас есть посещаемая страница, но её содержимое устарело и вы решили её переделать. Чтобы не оставлять неактуальную информацию в публичном доступе, вы решаете временно перенаправлять посетителей на страницу-заглушку. Делать это при помощи 301 редиректа неправильно, лучше использовать редирект 302.

Как настроить 301 редирект в .htaccess

В этом разделе перечислим основные ситуации, в которых обычно возникает необходимость настроить 301 редирект, и дадим примеры правил для .htaccess. Вам останется только скопировать их и подставить свой домен вместо примера.

Если у вас домен с кириллическими символами, его нужно сначала преобразовать в Punycode. Правила с символами не из латинского алфавита в .htaccess работать не будут.

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

Такой редирект обычно настраивают, когда хотят изменить URL-адрес страницы или старую страницу удаляют, но чтобы не терять трафик, ведут на похожую.

Redirect 301 /старая-страница /новая-страница

301 редирект с одного домена на другой

Такой редирект обычно настраивают, когда переносят сайт на новый домен или хотят, чтобы на один и тот же сайт можно было зайти с нескольких доменов. Для этого в .htaccess понадобится добавить такое правило:

RewriteCond %{HTTP_HOST} ^domen-1\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.domen-1\.com$
RewriteRule ^(.*)$ https://domen-2.com/$1 [R=301,L]

Если переносите сайт на новый домен, просто настроить 301 редирект недостаточно. Полный список необходимых действий вы найдёте у нас в блоге: Как сменить домен и не потерять позиции.

301 редирект с поддомена на подпапку

Например, у вашего блога был адрес blog.domen.com, но вы решили сменить этот адрес на domen.com/blog. Тогда правило для редиректа будет таким:

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

301 редирект с HTTP на HTTPs

Когда вы только установили SSL-сертификат, на сайт можно попасть и по HTTP и по HTTPs. Чтобы защищённая версия сайта открывалась, даже если человек специально добавит http:// в браузере, нужно настроить 301 редирект с HTTP на HTTPs. Для этого добавьте в .htaccess такое правило:

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://domen.com/$1 [R=301,L]

301 редирект с WWW на без WWW

Как мы уже говорили, для поисковых систем одна и та же страница с WWW и без WWW — это разные страницы. Чтобы не плодить дубликаты и не снижать уникальность контента, стоит выбрать один вариант написания ссылок и настроить на него 301 редирект со всех других вариантов.

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

Это можно проверить двумя способами:

  • загуглить по очереди обе версии домена с оператором “site” (site:domen.com и site:www.domen.com) и посчитать, у какого варианта больше результатов в выдаче;
  • добавить обе версии сайта в Google Search Console и проверить количество страниц в индексе там. Этот вариант будет более точным.

Чтобы настроить 301 редирект с WWW на без WWW, добавьте в .htaccess такой код:

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

Если вам наоборот нужно настроить редирект 301 с без WWW на WWW, используйте такое правило:

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

301 редирект с без слеша на слэш

Так же как в примере с WWW и без WWW, на одну и ту же страницу обычно можно зайти по ссылке с косой чертой в конце и без неё. Для поисковых систем такие страницы тоже будут дубликатами.

Чтобы случайно не нарваться на санкции от поисковиков, будет правильно привести всё к одному варианту. Вот правило, которое добавит редирект 301 для ссылок без слеша на ссылки со слешем:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /$1/ [L,R=301]

Если хотите, чтобы все ссылки наоборот были без слеша, добавьте в .htaccess такое правило:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /$1 [L,R=301]

301 редирект на URL без расширения

Допустим, у вас есть страница https://domen.com/about.html, и вы бы хотели, чтобы в адресной строке отображалось только https://domen.com/about. В таком случае добавьте такое правило:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.+)$ $1.html [L,QSA]
RewriteCond %{THE_REQUEST} ^[a-z]{3,9}\ /.*\.html\ HTTP/
RewriteRule ^(.*)\.html$ /$1 [R=301,L]

Если нужен редирект не для .html, а для другого расширения, напишите в нужных местах в правиле именно его.

301 редирект с верхнего регистра на нижний

Как и в предыдущих примерах, для поисковых ботов ссылки с разным регистром — https://domen.com/home и https://domen.com/Home — это две разные страницы.

Обычно никто специально не создаёт такие дубликаты, но некоторые движки делают это автоматически. В этом случае лучше выбрать какой-то главный вариант и настроить на него 301 редирект со всех остальных.

Лучше всего делать такой при помощи .htaccess и PHP. Можно, конечно, только при помощи .htaccess, но тогда придётся прописывать команды для проверки каждой буквы. Это будет создавать дополнительную нагрузку на Apache. Скорее всего, незначительную, но всё равно. Поэтому лучше делать в два этапа. Для этого добавьте в .htaccess такой код:

RewriteCond %{REQUEST_URI} [A-Z][OR]
RewriteCond %{QUERY_STRING} [A-Z]
RewriteCond %{REQUEST_FILENAME} !-s
RewriteRule (.*) rewrite-strtolower.php?rewrite-strtolower-url=$1 [QSA,L]

Затем создайте в этой же папке файл rewrite-strtolower.php и добавьте в него строки:

<?php
if(isset($_GET['rewrite-strtolower-url'])) {
$url = $_GET['rewrite-strtolower-url'];
unset($_GET['rewrite-strtolower-url']);
$params = http_build_query($_GET);
if(strlen($params)) {
$params = '?' . $params;
}
// Если на целевом ресурсе нет SSL сертификата, замените https:// на http:// ниже
header('Location: https://' . $_SERVER['HTTP_HOST'] . '/' . strtolower($url) . $params, true, 301);
exit;
}
header("HTTP/1.0 404 Not Found");
die('Unable to convert the URL to lowercase. You must supply a URL to work upon.');

301 редирект для нового формата перманентных ссылок на сайте с WordPress

Если у вас сайт на WordPress и вы поменяли формат ссылок на посты или товары, ссылки старого формата перестанут работать. Если до смены формата люди делились ссылками на ваш сайт в соцсетях, после смены формата при переходе по ним будет возникать ошибка 404.

Для таких ситуаций тоже есть решение: сгенерируйте правило для .htaccess в специальном сервисе Yoast. Тогда старые ссылки продолжат открываться.

Как сделать свою команду для 301 редиректа в .htaccess

Этот раздел для тех, кто хочет попробовать понять содержимое правила для .htaccess или проверить его на ошибки, когда редирект не работает. Вот так выглядит синтаксис правила:

RewriteEngine On
RewriteBase /
RewriteCond %{Переменная} Условие Флаг
RewriteRule Шаблон Значение Флаг

RewriteEngine — команда, которая включает компонент веб-сервера Apache, который отвечает за редиректы. Её достаточно указать один раз перед всеми командами.

RewriteBase — команда, которая указывает путь от корневой папки сайта до файла .htaccess. В этом примере косая черта означает, что файл лежит в корневой папке сайта. Её тоже достаточно указать один раз.

RewriteCond — команда, которая определяет условия выполнения редиректа. Например, вы хотите перенаправить все URL в верхнем регистре на URL в нижнем регистре. Тогда условие будет таким: «В запросе есть URL с буквами в верхнем регистре». Если да, происходит редирект. Если нет, веб-сервер пропускает это правило. Причём в одном правиле таких условий может быть неограниченное количество.

RewriteRule — действие, которое веб-сервер должен выполнить при удовлетворении условий в строках RewriteCond.

Переменные

Помогают веб-серверу определить, что конкретно нужно проверить в строке с условием выполнения редиректа. Например, ввели адрес сайта с HTTP или с HTTPs. Или совпадает ли адрес сайта с тем, который указан в условии. Или что нужно сделать с той частью URL, которая идёт после домена.

Переменные всегда пишут в фигурных скобках и ставят перед ними знак процента. Вот самые популярные из них:

%{HTTP_HOST} — проверить адрес, который человек ввёл в браузере. Например, если в правиле стоит эта переменная, а после неё ^domen.com$, это будет значить «выполнить редирект, если человек ввёл в браузере domen.com». А если человек введёт www.domen.com, редирект не сработает.

%{HTTPS} — проверить, отправлен ли запрос по HTTPs протоколу. Например, если в правиле стоит эта переменная и условие !=on, обрабатываться будут только запросы с адресом, который ввели с HTTP.

%{REQUEST_FILENAME} — путь к файлу или скрипту из запроса. Например, если в правиле стоит эта переменная и условие !-f, это значит, что нужно пропустить запрос, если по адресу, который ввёл пользователь, расположен файл.

%{THE_REQUEST} — полный текст HTTP запроса, который браузер отправил серверу. Например, если в правиле есть эта переменная и значение ^[a-z]{3,9}\ /.*\.html\, это будет означать, что правило должно сработать для запросов, которые начинаются с любых букв в количестве от 3 до 9 и заканчиваются на .html.

%{REQUEST_URI} — всё, что идёт в запросе пользователя после доменного имени. Например, в запросе https://domen.com/account/dashboard переменная символизирует текст /account/dashboard. Если в правиле идёт эта переменная, а за ней [A-Z], значит правило должно сработать, только если после домена в адресе есть большие буквы.

%{QUERY_STRING} — параметры, которые идут в URL после знака ?. Например, вы выбираете в магазине обуви бренд Adidas и видите в URL что-то типа этого: https://obuv.com/results/?krossovki=adidas. GET-параметры в этом случае это как раз кусочек ?krossovki=adidas.

Условия

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

Например, вы хотите настроить редирект домена с WWW на без WWW. Тогда условием будет имя со специальными символами: ^www.domen.com$. Оно означает, что редирект должен выполняться, только когда кто-то вводит домен с WWW.

Также с переменной в качестве условия часто используют уточняющие атрибуты. Вот два самых популярных из них:

-f — проверяет, ведёт ли запрос пользователя к реальному файлу на сервере.

Например, вы хотите сделать так, чтобы в конце URL всегда добавлялся слэш. В этом случае нужно исключить сценарии, когда в запросе человека — путь к конкретному файлу, например, domen.com/index.php. Иначе к index.php тоже добавится слэш и тогда страница не откроется, потому что это будет уже не ссылка на файл.

Чтобы таких ситуаций избежать, к переменной %{REQUEST_FILENAME} добавляют условие !-f. Тогда сервер будет пропускать запросы, которые ведут к реальным файлам.

-d — проверяет, ведёт ли запрос пользователя к реальной папке на сервере.

Здесь та же логика, что и в случае с предыдущим атрибутом, но вместо файла сервер будет искать папку. Например, вы хотите наоборот сделать так, чтобы в конце URL не было слэша. В этом случае вам понадобится исключить сценарии, когда в запросе человека — путь к папке. Иначе слэш удалится и страница не откроется, потому что будет уже не папкой, а файлом без расширения.

Символы

^ — начало строки.

$ — конец строки.

# — комментарий.

! — символ отрицания.

[0-9] — любая цифра от 0 до 9.

[A-Z] — любая буква от A до Z в верхнем регистре.

[a-z] — любая буква от A до Z в нижнем регистре.

[a-Z] — любая буква от A до Z в любом регистре.

[A-Z]{3,6} — любая строка, которая заканчивается на последовательность от 3 до 6 букв в верхнем регистре и диапазоне от A до Z.

[0-9]{3,6} — любая строка, которая заканчивается на последовательность от 3 до 6 цифр в диапазоне от 0 до 9.

. — любой символ, кроме символа конца строки.

? — повтор предыдущего символа 0 или 1 раз.

+ — повтор предыдущего символа от 1 до 65536 разов.

* — повтор предыдущего символа от 0 до 65536 разов. Например, выражению dome*n будут соответствовать значения domen, domeen, domeeeeeeeeen.

\ — экранирующий слэш. Следующий символ после него будет считаться обычным, а не спецсимволом. Иногда без такого слэша правило не будет работать. Например, когда в тексте есть точка, потому что сама по себе точка означает «любой символ».

^(.*)$ — сочетание спецсимволов, которое выбирает URL из условия RewriteCond, чтобы применить к нему действие из RewriteRule.

Флаги

Это дополнительные опции. Всегда перечисляются в квадратных скобках. Если флагов в одной строке несколько, их перечисляют через запятую, например, [L, R=301]. Вот небольшой список популярных флагов:

[R=301] — редирект вместе с его кодом. Если специально не прописать число, оставить только букву R, сработает 302 редирект. Так что для постоянного редиректа прописывайте вручную код 301.

[L] — останавливает процесс преобразования, и текущая ссылка считается окончательной. Обычно этот флаг используют в конце каждой команды.

[NC] — отключает проверку регистра символов при срабатывании правила.

[OR] — указывает на альтернативное условие. Если в правиле две строки RewriteCond, они суммируются. То есть редирект произойдёт только при удовлетворении условий в обеих строках. Если строки с условиями взаимоисключающие, используйте этот флаг. Тогда правило сработает при выполнении хотя бы одного из условий.

Как настроить 301 редирект в панели управления cPanel

Эту панель управления предлагаем у себя на хостинге мы и некоторые другие провайдеры. В ней есть встроенный функционал для настройки 301 редиректа. Если у вас на хостинге такая панель и редактировать .htaccess для вас кажется сложным, попробуйте этот вариант.

Приложение для настройки 301 редиректа называется «Перенаправления» и находится на главной странице панели в разделе «Домены».

Как настроить 301 редирект — Раздел «Перенаправления» в cPanel

На следующей странице вам понадобится выбрать тип перенаправления (301 или 302) и домен, для которого нужно настроить редирект, вписать конечный URL-адрес и выбрать условие: перенаправлять только адреса с WWW, только без WWW или и те и другие.

Настройка 301 редиректа в cPanel
С таким заполнением полей будет работать редирект с одной страницы на другую

Чуть ниже на этой же странице будет список всех настроенных редиректов в вашем хостинговом аккаунте. Там вы сможете удалить редиректы, если они вдруг станут не нужны.

Как сделать 301 редирект — Список редиректов в приложении «Перенаправления»

Плагины для настройки 301 редиректа в WordPress

Если у вас сайт WordPress, настраивать редиректы можно прямо в панели управления сайтом — для этого достаточно только установить специальный плагин. Есть много, но эти два показались нам самыми удобными.

Redirection — самый популярный плагин для настройки редиректов и единственный плагин с русскоязычным интерфейсом. Кроме основного функционала также отслеживает 404 ошибки на сайте и показывает, сколько раз люди переходили по адресам, для которых настроен редирект.

Htaccess File Editor — плагин, который даёт возможность редактировать файл .htaccess прямо из консоли WordPress. Это удобнее, чем каждый раз заходить в панель управления хостингом, открывать менеджер файлов и искать файл в корневой папке.

Распространённые проблемы с 301 редиректами

Если настроить редирект 301 неправильно, конечная страница может не открываться или редирект не будет оказывать ожидаемого эффекта — ссылочный вес не будет передаваться. Вот часто встречающиеся ошибки, на которые стоит обратить внимание.

Цепочки редиректов

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

Проанализируйте свой сайт при помощи сервиса httpstatus или программы Screaming Frog, чтобы проверить, если ли нём цепочки редиректов.

Циклические редиректы

Это когда в ходе редиректа один из URL адресов ведёт обратно на предыдущий адрес в цепочке редиректов. Иногда такое случается, если в DNS-записях домена создана запись, которая перенеправляет домен без WWW на версию с WWW, но администратор сайта настраивает в .htaccess редирект с WWW на без WWW.

В результате страница будет долго загружаться и в браузере выскочит ошибка с текстом ERR_TOO_MANY_REDIRECTS. Проверить свой сайт на подобные ошибки можно при помощи программы Screaming Frog.

Битые редиректы

Это когда конечная страница не открывается и возвращает HTTP-код 4хх или 5хх. Например, 403 Forbidden или 500 Internal Server Error. Про другие подобные ошибки читайте в статье: Коды ошибок HTTP.

В подобной ситуации ни посетители, ни поисковые роботы не могут попасть на конечный URL-адрес. Если не исправить эту ошибку на конечной странице, она рискует выпасть из поискового индекса.

Проверить сайт на подобные ошибки тоже можно при помощи программы Screaming Frog. Также уведомления об ошибках будут отображаться в Google Search Console, если вы добавляли туда свой домен.

Редирект 301 вместо атрибута rel=”canonical”

Иногда на сайтах встречаются страницы с сильно похожим содержимым или вообще одна и та же страница, которая доступна по нескольким URL-адресам. Такое бывает в интернет-магазинах: движок сайта добавляет в URL дополнительные символы, когда посетитель меняет на ней фильтры или включает сортировку. В результате кроме основного URL у страницы есть ещё несколько версий с разными дополнительными параметрами.

Другой пример — товар находится сразу в нескольких категориях и URL-адрес меняется в зависимости от того, из какой категории человек на него переходит. Например, есть товар — кроссовки для бега Adidas Runfalcon. Их можно найти в категории «Кроссовки», а также подкатегориях «Кроссовки Adidas» и «Кроссовки для бега».

Некоторые CMS в такой ситуации генерируют три страницы с разными адресами:

  • при переходе из категории «Кроссовки» – https://vashdomen.com/krossovki/adidas-runfalcon
  • при переходе из подкатегории «Кроссовки Adidas» – https://vashdomen.com/krossovki/adidas/adidas-runfalcon
  • при переходе из подкатегории «Кроссовки для бега» – https://vashdomen.com/krossovki/running/adidas-runfalcon

Вроде и дубликаты, но не убирать же из-за этого товар из других категорий. Редирект для каждого дубликата тоже лучше не настраивать. Если товаров в каталоге много, это сотни дополнительных строк в .htaccess и дополнительная нагрузка на веб-сервер.

Правильным решением будет выбрать главную страницу и добавить ей атрибут rel=”canonical”. Это делают в коде страницы между тегами <HEAD></HEAD>.

Атрибут rel=”canonical” говорит поисковикам: у страницы есть дубликаты, но конкретно эту нужно считать главной. В итоге именно она будет отображаться в результатах поиска, на неё перейдёт ссылочный вес и другие характеристики дубликатов, которые влияют на позицию в выдаче.

Рекомендации Google по использованию атрибута rel=”canonical”

Что дальше

Теперь вы знаете, как сделать 301 редирект на своём сайте. Расскажите в комментариях, нашли ли вы ответы на свои вопросы в статье. Возможно, какие-то команды для .htaccess не сработали или вы не нашли нужную команду. Постараемся разобраться вместе.