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);
?>