301 редирект: лучшее руководство по настройке

301 код ошибки (Moved Permanently) означает, что данная страница или весь сайт перемещены на новый постоянный URL навсегда. Используется для передачи ссылочного веса. Обязательно проверяйте какой код ошибки отдает сервер, когда настроите данный редирект. Я использую для этого, например, замечательный плагин Firebug для Firefox.

Схема работы 301 редиректа
Схема работы 301 редиректа

Настройка 301 редиректов, если у Вас веб-сервер linux Apache, происходит в файле .htaccess. А в случае windows веб-сервера IIS — это будет файл web.config.

301 редирект на различных CMS, таких как wordpress, битрикс, друпал, dle, modx, joomla, opencart и других, настраивается с помощью специальных плагинов, а также обычным способом через htaccess или web config.

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

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

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

  • ^ — ограничение слева (начало строки);
  • $ — ограничение справа (конец строки);
  • . — любой символ;
  • () — переменная;
  • \ — экранирование (символ после \ считается обычным, а не спецсимволом);
  • [] — диапазон значений;
  • ! — спецсимвол отрицания;

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

  • ? — символ повторяется 0 или 1 раз;
  • + — 1 и более символов (до 65536);
  • * — 0 и более символов (до 65536);

Настройка 301 редиректов в файлах htaccess и web.config

Я публикую здесь только проверенные и технически законченные рабочие варианты 301 редиректов. База рабочих вариантов 301 редиректов будет пополняться.
Редирект со старой статической (чпу) страницы на новую страницу:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.seowind\.ru$ [NC]
RewriteRule ^baza-znanij-seo/nastrojka-301-redirekta/$ https://www.seowind.ru/newpage/ [R=301,L]

Редирект на главную страницу:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.seowind\.ru$ [NC]
RewriteRule ^baza-znanij-seo/nastrojka-301-redirekta/$ https://www.seowind.ru/ [R=301,L]

Редирект с главной на внутреннюю страницу:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.seowind\.ru$ [NC]
RewriteRule ^$ https://www.seowind.ru/baza-znanij-seo/nastrojka-301-redirekta/ [R=301,L]

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

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

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

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

Следующий пример позволяет убрать слеш на конце урла.

Редирект 301 со страниц со слешем на конце на страницы без него:

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

А здесь добавляем слеш в конец урла:

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

301 редирект с index.php на главную:

RewriteEngine On
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ https://www.seowind.ru/ [R=301,L]

Редирект всех внутренних страниц на главную:

RewriteEngine On
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule !(^$|.*\.(css|jpg|gif)) / [R=301,L]

Редирект урла с параметром на любую внутреннюю страницу сайта: (Например, со страницы http://www.site.ru/news.php?category=1 на http://www.site.ru/news.php?category=2 (здесь параметр category=)):

RewriteEngine On
RewriteCond %{QUERY_STRING} category=1
RewriteRule ^news.php http://www.site.ru/news.php?category=2 [R=301,L]

Редирект урла с параметром на главную страницу сайта: (Например, http://site.ru/index.php?show_section=12 на главную страницу http://site.ru/ (здесь параметр show_section=12)):

RewriteEngine On
RewriteCond %{QUERY_STRING} show_section=12
RewriteRule ^index.php http://site.ru/? [R=301,L]

Редирект со старого домена на новый (прописываем в htaccess старого сайта):

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

Редирект с домена РФ на домен RU . Здесь важно знать, что РФ зона преобразуется в .xn--p1ai , а само название кириллического домена в соответствующий код (punycode) на латинице xn-… .

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

301 редирект каталога:

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

Вы наверное в своей практике встречали случай, когда есть 2 сайта с одинаковой информацией, но в то же время доступные по разным адресам (сайты дубли). У этих сайтов одинаковый robots.txt, sitemap.xml и один на двоих .htaccess. Предлагаю вариант 301 редиректа с неосновного такого сайта (site2) на основной (site1):

RewriteEngine On
RewriteCond %{HTTP_HOST} ^site2.ru$ [OR,NC]
RewriteCond %{HTTP_HOST} ^www.site2.ru$ [NC]
RewriteCond %{REQUEST_URI} !^/robots.*
RewriteRule ^(.*)$ http://www.site1.ru/$1 [R=301,L]

Вставка включающая в себе все редиректы со страниц index|default с расширениями htm|html|php|asp|aspx на главную:

RewriteEngine On
RewriteCond %{THE_REQUEST} ^GET\ .*/(index|default)\.(htm|html|php|asp|aspx)\ HTTP
RewriteRule ^(.*)(index|default)\.(htm|html|php|asp|aspx)$ http://www.site.ru/$1 [R=301,L]

Пример редиректа со страниц без WWW на страницы с WWW в web.config для IIS:


<system.webServer>
<rewrite>
<rules>
<rule name="Redirect to WWW" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{HTTP_HOST}" pattern="^seowind.ru$" />
</conditions>
<action type="Redirect" url="https://www.seowind.ru/{R:0}" redirectType="Permanent" />
</rule>
</rules>
</rewrite>

Пример редиректа со страницы default.aspx на главную в web.config для IIS:


<system.webServer>
<rewrite>
<rules>
<rule name="Imported Rule 1">
<match url="^default\.aspx" ignoreCase="false" />
<conditions>
<add input="{QUERY_STRING}" pattern="^$" ignoreCase="false" />
</conditions>
<action type="Redirect" redirectType="Permanent" url="https://www.seowind.ru/" />
</rule>
</rules>
</rewrite>

301 Редирект через PHP

<?php
header("Location: http://newdomain.ru/new/location/", true, 301);
?>

49 комментариев к “301 редирект: лучшее руководство по настройке”

  1. То есть, если я правильно поняла, при установке ЧПУ, если у меня до этого были адреса страниц вида /p1234? мне необходимо перенаправлять каждую страницу на новый адрес?!

  2. Марат

    вот эта строка:
    RewriteCond %{HTTP_HOST} ^www.site.ru$ [NC]

    разве в ней не нужен слеш, экранирующий точку?

    RewriteCond %{HTTP_HOST} ^www.site\.ru$ [NC]

    Иначе… Конечно, работать будет, но …гм… точка означает любой символ, либо его отсутствие, и дальше часть «ru»

    1. Добрый день, Марат!
      Можно так как написали Вы, а можно так не делать — как это есть и в моих примерах.
      Ошибкой не будут оба варианта. Они рабочие.

      1. Марат

        Работать-то конечно будут оба варианта.))) Но т.к. Вы мой коллега — не могу пройти мимо. Если бы теоретически существовал вот такой домен www(точка)sitea(точка)ru, то он бы проскочил этот фильтр, т.к. буква «a» подпадает под точку.

        И, кстати, после www тоже точка стоит, и она требует экранирования.

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

  3. Андрей

    Добрый день, администратор этого сайта. Отличная статья, но я не нашел примера моего редиректа. Подскажите пожалуйста как будет выглядить редирект 301 в этом случаи:

    c site(точка)ru/good(точка)php на чпу ссылку site(точка)ru/good_page/

    заранее спасибо.

    1. Добрый вечер, Андрей!
      Попробуйте, пожалуйста, так

      RewriteEngine On
      RewriteRule ^(.*)good.php$ http(двоеточие)//site(точка)ru/good_page/ [R=301,L]

      1. Андрей

        RewriteEngine On
        RewriteRule ^(.*)good.php$ http://site.ru/good_page/ [R=301,L]

        спасибо за ответ, но вариант не работает. Ибо перебрасывает на http://site.ru/good_page/ — в итоге имеем не существующую страницу. Сервер пишет: страница не найдена. Так кстати я тоже пробовал, если просто переходить, то ссылка работает, а если редиректом не работает. Понять пока не могу почему так.

        1. Андрей, будет лучше, если Вы напишите урлы живого своего сайта. Я вот тоже не могу понять почему так. Ведь вариант должен работать.

  4. Здравствуйте.
    Проблема вот в чем: после вставки строк:

    RewriteEngine On
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
    RewriteRule ^index\.php$ http://www.site.ru/ [R=301,L]

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

        1. Движок Joomla 2.5.4.
          В Основных настройках включил Перенаправление URL и нормально стало. А до этого вроде страницу кеширует, ни залогиниться ни вылогиниться.

    1. Честно говоря такой редирект никогда не делал и более того скажу, что так делать неправильно! Это как оптимизатор говорю. Любая несуществующая страница должна отдавать 404 код ошибки, а редирект подразумевает 301 код.

  5. Николай

    Спасибо! Самый хороший, полный и понятный пост про редиректы на данный момент. Для полноты картины не хватает только редиректов со слешем и без на конце.

    Например, такой код:

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

    Есть и другие варианты, но почему-то работают не всегда. Этот вроде надёжный.

  6. Добрый день. Подскажите, пожалуйста, как решить такую задачу.

    Перенес сайт с джумлы на вордпресс. В джумле страницы вида:
    site.com/category/zdorove-mamy-i-rebenka.html (на конце .html).

    Мне нужно сделать 301 редирект на страницы без html на конце, вида
    site.com/category/zdorove-mamy-i-rebenka/ (со слешем либо без на конце).

    Спасибо (желательно не силами движка ВП, а именно .htaccess).

  7. Помог друг. Вот решение. Добавить нужно к существующим записям:

    RewriteBase /
    RewriteRule ^(.*)\.html$ $1 [L,R=301]

  8. Антон

    Здравствуйте, нужна помощь, нигде не могу найти ответа. Сайт сделан на Ajax и имеет адрес типа http://www.site.ru/#!/page_1 . Символ #! яндекс преобразует в параметр ?_escaped_fragment_= . Как сделать, чтобы страницы типа http://www.site.ru/?_escaped_fragment_=/page_1#!/ (page_1 -разные страницы на сайте) переходили на страницы вида http://www.site.ru/#!/page_1

  9. Добрый день, помогите, не могу определиться! Есть сайт, который имеет около 20-ти страниц, типа http://www.sait.ru/produkt.html.

    Все страницы находятся в корневом каталоге в формате HTML, но когда нужно что-то менять на сайте, например, номер телефона, то приходится редактировать все страницы сайта. Поэтому решил создать базу данных на PHP-mysql.

    Страницы удается назвать в PHP-mysql только таком виде — http://www.sait.ru/produkt/. Версия php на хостинге PHP 5.2.10 и rewrite_module включен. Прошу вашей профессиональной помощи.

    Как правильно настроить редирект со старых адресов типа produkt.html на новые адреса, типа /produkt/ при этом сохранить все возможные привилегии от поисковиков?.

    Старые адреса типа produkt.html, будут удалены из корневого каталога, сразу после создании в базе данных новых адресов, типа /produkt/. Пожалуйста, еще вопрос: если будут меняться названия страницы таким образом, например:

    • — produkt.html превратится на /produkt/
    • — catalog.html превратится на /catalog/

    Их 20 штук и все они разные.
    Можно прописать редирект один раз для всех страниц? или же придется писать для всех страниц по отдельности?

    Возник еще вопрос, тоже немало важный. Почему-то, когда открываешь в строке поиска любые страницы, которых нет в базе данных, открывается шаблон страницы без контента, пример:
    типа http://www.sait.ru/pro/ или же типа http://www.sait.ru/drt/. В общем, если написать любое слово или несколько любых букв между слешами, открывается шаблон без контента.

    Еще пример для динамических сайтов:
    http://www.sait.ru/index.php?page=1000, если на место 1000 написать любые цифры, которых нет в базе данных, открывается также пустой шаблон сайта.

    Вопросы:

    1. 1. Эти моменты на сколько негативно влияет на раскрутку сайта?
    2. 2. Можно ли настроить хтаксес так, чтобы при поиске этих страниц открывались 404 ошибка?
    3. 3. Или же эти проблемы не решается через файл хтаксес?

    Заранее спасибо !

  10. ДЕМОН

    в шестом варианте добавьте вопросительный знак после index.php, иначе в адресной строке показывается старый параметр

  11. Руслан

    Здравствуйте. у меня пара вопросов по редиректу: как правильно редактировать файл htaccess?? как я понял из него всё удаляется и вставляется один из ваших примеров? или как то ещё? я попробовал сделать так как написано в примерах, но при переходе на сайт редирект не срабатывает. и второй вопрос: какой метод мне больше подходит если сайты расположены на одном хост-аккаунте но в разных корневых папках?
    Заранее благодарен!

  12. Андрей

    Здравствуйте! Подскажите, пожалуйста, как сделать 301 редирект со страниц вида site.ru/page на страницы вида site.ru/page.html? Если в данной статье есть ответ, продублируйте если не сложно, сам не разобрался.
    Заранее спасибо!

  13. Марина

    Добрый день!

    Не могли бы Вы мне подсказать такую ситуацию:

    Был сайт http://site.net сделанный на WP, и соответственно имел страницы такого вида

    http://site.net/?page_id=450

    теперь сайт переделали на Joomla и та же страница стала иметь такой вид

    http://site.net/azbuka.html

    Как правильно сделать 301, чтобы не потерять PR?

    Так:

    Redirect 301 /?page_id=450 http://site.net/azbuka.html

    Или так:

    RewriteCond %{QUERY_STRING} ^id=450$
    RewriteRule ^/page.php$ http://site.net/azbuka.html%5BL,R=301%5D

    Буду очень благодарна за ответ, а то шеф уволить обещал…)

  14. Евгений

    Здравствуйте.
    Подскажите, как правильно сделать:
    есть сайт с адресами site.ru/catalog/item, надо сделать site.ru/item

    Спасибо

  15. Andrey Szestkov

    Спасибо за полезные советы, но у меня вот какая проблема. Я сделал новый сайт для компании на движке Joomla, а старый был на Drupal. Да и доменное имя перенес на новый хостинг. Новый сайт Яндекс пока не индексирует и все ссылки только на старый. Главная страница совпадает и это хорошо, по ней посетители попадают на новый сайт, а вот остальные страницы — нет. При переходе по ним у меня показывает ошибку 404.

    Можно ли, в данном случае, сделать редирект или что-то другое, чтобы люди проходя по старой ссылке http://site.ru/montajnoe переходили на новую http://site.ru/index.php/ru/o-kompanii/montazhnoe-upravlenie-mitol.html и т.д. по всем старым ссылкам. Если не сложно, ответьте на почту maycompani@gmail.com.

    С уважением, Андрей.

  16. Если запросить заведомо некорректный URL вида http://site.ru/?N, где N – любой численный или строковый параметр, например http://site.ru/?qwerty, сервер отдаёт 200 ОК. Хотя, по идее, правильно было бы 404 Not Found или 301 Moved Permanently. Что вроде как реализовывается при помощи модуля Mod_rewrite. Прав ли я? И если да, то, как можно исправить ситуацию?
    Спасибо.

  17. В таком случае правильно отдавать 404 Not Found. 301 в таком случае делать не надо.

  18. stylewomens

    А как мне со старых страниц, на новые сделать редирект? если там 3 параметра ?i= &add &pg

  19. Автору огромный респект! Только здесь нашёл исчерпывающую информацию о всевозможных редиректах. Да ещё и с конкретными примерами, готовыми к использованию. Спасибо!

  20. Но я так понимаю, что это не критично, т.к. сколько сайтов я не смотрел у всех такого рода конструкция http://site.ru/?qwerty, отдаёт 200 ок, хотя, как я уже писал выше, вроде как не должен сервер по правилам отдавать 200 ок, но по ходу никто не заморачивается. У вас тоже, кстати, 200 ок.

  21. Да, Andrei — это распространенная проблема у многих. В идеале должна отдаваться 404 ошибка. Но если такое сделать не получается то хотя бы в robots.txt закрывается, например, как у меня: Disallow: /*?* — этого будет во многих случаях хватать.

  22. Александр

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

    RewriteCond %{QUERY_STRING} category=1
    RewriteRule ^news.php http://www.site.ru/news.php?category=2 [R=301,L]

    а то я когда прописываю такие же 2 строчки ниже с другими параметрами, ничего не выходит, а мне нужно 6 страниц перенаправить 301 редиректом.

  23. Скажите а редирект 301 можно сделать с идентификатором «?sid=003acc58c948ea31227f87671154fc3f» в phpbb3, чтобы если в строке присуттвует «sid» то он автоматом перебрасывается на главную 301

  24. Александр

    Вот что у меня в htaccess. RewriteCond %{QUERY_STRING} id=5&Itemid=2
    RewriteRule ^index.php http://www.mosdivecen.com/index.php?option=com_content&view=article&id=28&Itemid=118 [R=301,L]

    но мне помимо этого редиректа нужно сделать еще 3-4 таких же
    приведу их в порядке «откуда -> куда » :

    http://www.mosdivecen.com/index.php?option=com_content&view=article&id=2&Itemid=25
    ->
    http://www.mosdivecen.com/index.php?option=com_content&view=article&id=47&Itemid=159

    http://www.mosdivecen.com/index.php?option=com_content&view=article&id=3&Itemid=4
    ->
    http://www.mosdivecen.com/index.php?option=com_content&view=article&id=28&Itemid=145

    вот так вот, помогите пожалуйста

  25. Евгений Титов

    День добрый уважаемый администратор, у меня вот в чем проблема: Я в адрес страниц добавил название категорий, до этого их небыло, было вида http://sait.ru/bro/ потом стало вида: http://sait.ru/category/bro/. Как мне настроить в данном случае редирект 301?

  26. Александр

    Добрый день!
    Подскажите пожалуйста по ситуации.
    Есть сайт, на главной странице разделение на два направления, реализованное через поддомены. Одно из направлений закрыли, осталось только другое.
    Подскажите пожалуйста как грамотно прописать редирект, чтобы пользователей с главной страницы перенаправляло сразу в рабочее направление?
    Пробовал сам по образцам через 301, получалось только сделать так, что поддомен в адресе почему то пропадал и прежняя страница направления начиналась с site.ru, а ранее было с поддоменом (podomen.site.ru). Оставлять этот вариант не стал, опасаясь потерять ТИЦ и PR сайта в поисковиках и нарушения работы контекстной рекламы. Оставил все по старому. Сижу ломаю голову.

  27. Роман

    Здравствуйте! У меня ситуация следующая: хочу полностью переделать свой сайт. Он у меня работает на Joomla 1.5, хочу посадить его на Joomla 2.5. Часть разделов полностью уберу, часть будет доступна по новому адресу. Те, которые будут доступны по новому адресу, я вручную перенаправлю, это понятно. Но что мне сделать, чтобы все остальные страницы, которые более не существуют, выдавали бы редирект на главную страницу?

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

  28. попробовал уже «десяток» способов! и не один не спасает меня от расширений страницы в конце урла. есть ссылки вида frfrfrf.in.ua/folder1/sssss.html и в корне сайта тоже такая же ерунда!

    помогите пожалуйста!

  29. Александр

    Здравствуйте! Подскажите пожалуйста как сделать редирект с /index.php?section=services на /light.php . Заранее благодарю!

  30. Ростислав

    Здравствуйте, подскажите пожалуйста как можно сделать 301 редирект с параметром после /
    Ситуация в том, что был адрес ввиде http://site.com/ru/Models/devushki-modeli-portfolio/Inna_V/
    сайт был переделан и ЧПУ автоматом загнало ввиде http://site.com/portfolio/Inna-V/
    по своей сути я могу сделать редирект на страницу портфолио, но вот как сделать так чтобы нижнее подчеркивание становилось дефисом
    /Inna_V/ — генерировалось в /Inna-V/

  31. Константин

    Здравствуйте.
    У меня зарегистрировано 2 домена: в зонах ORG и RU, которые физически смотрят на один сайт.
    Написал вот так:
    RewriteCond %{HTTP_HOST} ^site-soft.org$ [OR,NC]
    RewriteCond %{HTTP_HOST} ^www.site-soft.org$ [NC]
    RewriteRule ^(.*)$ http://www.site-soft.ru/$1 [R=301,L]
    но что-то не вижу эффекта :((

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *