301 редирект в файле htaccess - детальная инструкция по применению
logo

301 редирект в файле htaccess - детальная инструкция по применению

SEO

301 Редирект — это способ постоянного перенаправления поисковых систем и посетителей сайта на адрес, который отличается от изначально запрашиваемого. Такой ответ сервера указывает на то, что старый URL утратил актуальность, страницу переместили. После переиндексации Яндекс и Google поймут куда вы теперь хотите вести посетителей и станут предлагать пользователям новый адрес.

Основные типы перенаправления и их разница (код ответа состояния HTTP):

  • 301 редирект (постоянное перенаправление) – означает, что страница или элемент перемещен на постоянной основе, и браузер должен искать его в новом месте. Чаще всего записываются в файле .htaccess (файл лежит обычно в корневой папке сайта, чаще всего это папка имеет название public_html).

  • 302 перенаправление или редирект – это временное перенаправление, которое означает, что страница или элемент перемещен временно, и его адрес в будущем может измениться. Чаще всего записываются в коде веб-сайта.

  • 307 Temporary Redirect - замена URL страницы на время. Исходная версия остается на тех же позициях. Для поисковых систем этот метод является практически копией 302 редиректа.

Помимо перечисленных вариантов автоматического перенаправления посетителя, существуют еще четыре.

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

  • 303 перенаправление - необходимый документ найден, но для его отображения потребуется использовать GET.

  • 304 редирект - информация о том, что сайт остался без изменений после посещения. Браузер открывает страницу из кэша.

  • 305 редирект - указывает на переадресацию на прокси-сервер, а затем на заданный поисковой системе запрос.

Когда использовать редирект 301

Redirect 301 HTML является правильным решением для предотвращения тупиковых переходов и объединения входящих ссылок. Ссылочный вес и трафик могут быть сохранены. Обычно редирект 301 используется, если нужно, чтобы поисковые системы перенесли весь SEO-вес на URL-адрес назначения после перемещения на него документа навсегда.

Случаи использования редиректа 301

  • Перемещение домена на постоянной основе;

  • Перемещение документа на постоянной основе;

  • Изменение протокола сайта на постоянной основе;

  • Изменение структуры сайта на постоянной основе.

Когда не нужно использовать редирект 301

Редирект 301 является неверным решением для случаев, в которых кэширование может привести к неожиданному негативному поведению.

Примеры:

  • Геотаргетинг;

  • Таргетинг устройств;

  • А / В тестирование;

  • Отслеживание (включая кампании с платой за клик и реферальные кампании).

Redirect 301 HTML также не следует использовать, если вы хотите применить временное перенаправление.

Когда использовать редирект 302

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

Случаи использования редиректа 302:

  • Геотаргетинг;

  • Таргетинг устройств;

  • А / В тестирование;

  • Отслеживание;

  • Периодическое временное содержимое;

  • Перенаправление при отсутствии страницы в результатах поиска.

Примеры:

  • Сезонные товары на сайтах электронной коммерции;

  • Временные специальные предложения на целевых страницах сайтов электронной коммерции.

Когда не следует использовать редирект 302

Код статуса 302 не следует использовать, если нужно передавать SEO-вес URL-адресу назначения.

Примеры:

  • Перемещение домена на постоянной основе;

  • Перемещение документа на постоянной основе;

  • Изменение протокола сайта на постоянной основе;

  • Изменение структуры сайта на постоянной основе.

 

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

Рекомендация номер один

Располагайте переадресации страниц в файле от частных к более глобальным (сверху вниз). Например: простая переадресация двух страниц стоит выше, чем глобальное правило редиректов c http на httpS или например с www на без www.

Номер два

Избегайте последовательных редиректов (двух, трех). Правила должны быть настроены так, что при возникновении редиректа он должен перенаправлять пользователя (робота) только один (!) раз. Каждое лишнее переадресация – это секунды драгоценного времени отдачи страницы, это нагрузка на сервер, это нечеткие команды для поисковых роботов.

Номер три

Если настраиваете редирект через файл .htaccess, то делайте это через FTP сайта, а не через админку сайта, если правило настроите не правильно, может получится так, что будет циклический редирект и на сайт уже будет не зайти. 

Ошибка “Слишком много перенаправлений” означает, что сайт продолжает циклично перенаправляться между разными адресами и это может никогда не прекратиться. Ваш браузер защищает вас от этого, разрешая только определенное количество перенаправлений (часто около десяти), прежде чем он «устанет» от этого и не выдаст данную ошибку.

Очень часто это является результатом конфликтных перенаправлений, одно из которых пытается принудительно установить HTTPS (SSL) соединение, а другое – обратно HTTP (не-SSL), или между URL-адресами с www и без www.

Не забывайте, что многие браузеры кешируют (запоминают) редиректы, поэтому проверять переадресации лучше на стороннем сайте.

Список сайтов (чекеров), где можно проверить 301 редирект и код ответа сервера онлайн

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

Операторы регулярных выражений

Директивы .htaccess состоят из спецсимволов и модификаторов. Перечень основных:

Спецсимволы:

  • ^ - ограничение слева (начало строки);

  • $ - ограничение справа (конец строки);

  • . - Точка это любой символ;

  • () - переменная (группировка);

  • \ - экранирование (символ после \ считается обычным, а не спецсимволом);

  • [] - диапазон значений;

  • [abc] — перечень символов, совпадающих с буквами a, b, или с.

  • [^abc] — перечень символов, не входящих в диапазон. Условию соответствует любой символ, кроме a, b, с.

  • * — предыдущий символ может повторяться 0 и более раз.

  • [abc]* — найти символы из заданного набора идущие подряд.

  • [^abc]* — обратная операция.

  • \w — буква, цифра или подчёркивание _.

  • \d — любая цифра.

  • \D — любой символ, кроме цифр.

  • [0-9] — указание на любую цифру.

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

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

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

  • [a-Z] — тоже самое, только короче.

  • ! - специальный символ отрицания;

Модификаторы:

  • ? - символ повторяется 0 или 1 раз;

  • + - 1 и более символов (до 65536);

  • * - предыдущий символ может повторяться 0 и более символов (до 65536);

Флаги для дополнительных опций в правиле

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

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

  • R — Redirect останавливает изменение URL-адреса и возвращает результат. Самое популярное значение R=301, однако встречаются и другие для временных редиректов (302, MOVED TEMPORARY).

  • L — Last останавливает создание URL-адреса и строка считается окончательной.

 

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

Почему 301 редирект не работает и нет перенаправления одной страницы на другую?  

  • не правильно настроен шаблон (регулярное выражение) редиректа в htaccess.

  • один редирект замещает другой (важен порядок конфигураций) в htaccess.

  • редирект закэшировался.

  • используется плагин, который делает редирект.

  • использовался плагин, который делал редирект, и его конфигурации остались в Базе данных после его отключения или удаления.

Еще один важный момент: 

При настройке правила редиректов в файле .htaccess все правила необходимо указывать после указанных двух строк, либо просто добавьте их:

Options +FollowSymLinks

RewriteEngine On

Подготовленный список правил переадресаций (готовые шаблоны): 

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

Самый простой вариант

Redirect 301 /test-1/ http://site.ru/test-2/

Развернутый  вариант постраничного перенаправления 

RewriteCond %{REQUEST_URI} ^/test/$
RewriteRule ^.*$ http://site.ru/new-test/? [R=301,L]

Важно! Можно записывать адреса в относительном виде, например, /test-1/ и /test-2/.

Также допускается использование конструкции:

Redirect permanent site.ru/test-1/  site.ru/test-2 

301 редирект с www на без www (главное зеркало – домен без www)

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

301 редирект с без www на www (главное зеркало – домен с www)

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

301 редирект со страниц со слешем на без слеша (весь сайт)

RewriteCond %{REQUEST_URI} !\?
RewriteCond %{REQUEST_URI} !\&
RewriteCond %{REQUEST_URI} !\=
RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_URI} ![^\/]$
RewriteRule ^(.*)\/$ /$1 [R=301,L] 

301 редирект со страниц без слеша на слеш (часто в CMS системах устанавливается автоматически)

RewriteCond %{REQUEST_URI} !\?
RewriteCond %{REQUEST_URI} !\&
RewriteCond %{REQUEST_URI} !\=
RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_URI} !\/$
RewriteRule ^(.*[^\/])$ /$1/ [R=301,L] 

 

Один (а не два последовательных!) 301 редирект на без www и с слешем на конце адреса страницы

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

 

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

 

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

 

Один (а не два последовательных!) 301 редирект на c www и со слешем на конце адреса страницы

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

 

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

 

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

 

Один (а не два последовательных!) 301 редирект на c www и без слеша на конце адреса страницы

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

 

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

 

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

 

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

 

Один (а не два последовательных!) 301 редирект на без www и без слеша на конце адреса страницы

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

 

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

 

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

 

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

 

301 редирект только адреса site.ru/index.php (без GET параметров) на основное зеркало site.ru

RewriteCond %{REQUEST_URI} /index.php
RewriteCond %{QUERY_STRING} ^\z
RewriteRule ^(.*)$ http://site.ru/? [R=301,L]

301 редирект всех адресов с index.php и GET параметрами на страницы только с GET параметрами (вырезать в url index.php)

Пример: типа site.ru/index.php?n=1 на site.ru/?n=1

RewriteCond %{REQUEST_URI} /index.php
RewriteRule ^(.*)$ http://site.ru/ [R=301,L]

301 редирект для index.php, index.html или index.htm (например в Joomla), массовая склейка

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.(php|html|htm)\ HTTP/ 
RewriteRule ^(.*)index\.(php|html|htm)$ http://site.ru/$1 [R=301,L]

301 редирект url с GET параметрами (динамический URL) на статический

1 вариант (простой адрес с GET параметром)

RewriteCond %{QUERY_STRING} ^id=229
RewriteRule ^.*$ /supermodel/? [R=301,L] 

2 вариант (со страницы и GET параметром)

RewriteCond %{REQUEST_URI} /test/
RewriteCond %{QUERY_STRING} ^id=229
RewriteRule ^.*$ /supermodel/? [R=301,L] 

Все страницы одного домена на главную страницу другого домена

RewriteCond %{REQUEST_URI} (.*)
RewriteRule ^(.*)$ http://site.ru/ [L,R=301]

Каждая страница одного домена на такой же адрес другого url

RewriteCond %{REQUEST_URI} (.*)
RewriteRule ^(.*)$ http://site.ru/$1 [L,R=301] 

Редирект с протокола http на https.

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

Если возникает циклический редирект, то воспользуйтесь этим вариантом:

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

Для Битрикс-сайтов на хостинге reg.ru

RewriteCond %{SERVER_PORT} !^443$
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

Для сертификатов https c Cloudflare:

RewriteCond %{HTTP:CF-Visitor} '"scheme":"http"'
# Without Cloudflare:
# RewriteCond %{HTTPS} off 
RewriteRule ^ https://www.example.com%{REQUEST_URI} [NE,R=301,L]

 

RewriteEngine On
RewriteCond %{HTTPS} =off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [QSA,L]

 

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

 

RewriteEngine On
RewriteCond %{ENV:HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

 

RewriteEngine on
RewriteCond %{HTTP:HTTPS}  !on
RewriteCond %{REQUEST_URI} !robots.txt
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

Редирект с протокола https на http.

Обратный редирект, если перестали использовать SSL сертификат.

RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301,L]