301-ая ошибка (301 Permament Redirect), возвращаемая при обращении к определенному адресу страницы, означает, что сайт был на постоянной основе перенесен на новый адрес, также указанный в HTTP заголовке. Как пользователи, зашедшие через браузер, так и поисковые боты будут перенаправляться по новому адресу, при этом, для поисковиков все свойства старого адреса (страницы) будут переданы новому URL. При 301 редиректе произойдет склейка старого и нового адресов: параметры вроде PageRank и тИЦ, а также вес страницы и ссылочный вес старого адреса будет передан новому URL.
Редирект с номером ошибки 301 (moved permanently) это наилучший способ сохранить рейтинг сайта в поисковых системах при переносе его на новый домен или смене системы управления контентом. Переадресацию можно выполнить несколькими способами, в зависимости от установленного программного обеспечения.
301 редирект в .htaccess
При использовании апача (apache) на сервере, переадресацию можно просто выполнить с помощью файла .htaccess, однако, при этом, не забыть включить модули mod_alias (для поддержки директив Redirect, RedirectPermanent и RedirectMatch) и/или mod_rewrite (для использования реврайта) в php.ini.
Редирект с помощью директивы Redirect или RedirectPermanent модуля mod_alias
Redirect 301 /old-page.html http://new-domain.ru/new-page.html
или
Redirect permanent /old-page.html http://new-domain.ru/new-page.html
Недостатком данного способа является то, что все адреса, которые необходимо перенаправить, нужно перечислять один за одним, каждый отдельно. Также можно использовать RedirectPermanent для аналогичных целей.
RedirectPermanent /old-url.html http://new-site.ru/new-url.html
Редирект с помощью директивы RedirectMatch
Этот редирект подобен предыдущему, за исключением того, что можно задавать регулярное выражение для старых URL адресов. Допустим, при смене движка с PHP на ASP, можно старые адреса перенаправить следующим образом:
RedirectMatch /(.*)\.php$ /$1.aspx
Редирект с помощью директивы RewriteRule модуля mod_rewrite
Для использования директивы RewriteRule необходимо удостовериться, что в httpd.conf подключен модуль mod_rewrite, а также влючена опция FollowSymLinks. Использование реврайт модуля дает много возможностей для перенаправления страниц на новые адреса.
Перенаправление домена с www на не-www
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
или альтернативный, более понятный синтаксис
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.domain\.com$ [NC]
RewriteRule ^(.*)$ http://domain.com/$1 [R=301,L]
Редирект запросов с не-www на домен с www префиксом
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^domain\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]
или же альтернативный вариант
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.(.*) [NC]
RewriteRule ^(.*)$ http://www.%1/$1 [R=301,L]
Редирект с помощью скрипта (отправки заголовков)
Редирект запросов можно осуществлять также с помощью скриптов, отправляя клиенту необходимые заголовки.
HTTP/1.1 301 Moved Permanently
Location: http://www.newdomain.ru/newdir/newpage.htm
PHP редирект
<?php
header(“HTTP/1.1 301 Moved Permanently”);
header(“Location: http://www.newdomain.ru/newdir/newpage.htm”);
exit();
?>
ASP редирект
<%@ Language=VBScript %>
<%
Response.Status=“301 Moved Permanently”
Response.AddHeader “Location”, “http://www.new-url.com”
response.end
%>
ASP.NET редирект
<script runat=“server”>
private void Page_Load(object sender, System.EventArgs e)
{
Response.Status = “301 Moved Permanently”;
Response.AddHeader(“Location”,“http://www.new-url.com”);
}
</script>
ColdFusion редирект
<.cfheader statuscode=“301” statustext=“Moved permanently”>
<.cfheader name=“Location” value=“http://www.new-url.com”>
JSP (Java) редирект
<%
response.setStatus(301);
response.setHeader( “Location”, “http://www.new-url.com/” );
response.setHeader( “Connection”, “close” );
%>
CGI PERL
$q = new CGI;
print $q->redirect(“http://www.new-url.com/”);
Ruby on Rails
def old_action
headers[“Status”] = “301 Moved Permanently”
redirect_to “http://www.new-url.com/”
end
Осуществление редиректа в nginx
if ($host = ‘www.domain.com’ ) {
rewrite ^(.*)$ http://domain.com$1 permanent;
}


andy
Февраль 24, 2009 at 16:18
1недели две назад купил хороший домен и сделал редирект. Роботс тоже отэдитил.
Все прекрасно работает.
Вот сейчас сижу ждут перетекания тИЦ..(а его нету
GPS
Апрель 8, 2009 at 22:25
2Привет,
> RewriteCond %{HTTP_HOST} !^www\.(.*) [NC]
> RewriteRule ^(.*)$ http:\/\/www\.%{HTTP_HOST}\.\/$1 [R=301,L] (маска конечного адреса поправлена)
в RewriteCond нужно добавить маску, проверяющую, что URL не является IP. Иначе, если сайт на выделенном адресе и пользователь ввел IP в браузер (мало ли по какой причине) получим xxx.xxx.xxx.xxx -> WWW.xxx.xxx.xxx.xxx
Zomb1e
Апрель 12, 2009 at 21:18
3тогда уж вот так:
RewriteCond %{HTTP_HOST} !^www\.(.*) [NC]
RewriteRule ^(.*)$ http:\/\/www\.%{HTTP_HOST}\.\/$1 [R=301,L]
а то в rewriterule, предложенным комрадом GPS, после {HTTP_HOST} добавляется лишняя точка.
artem
Июнь 1, 2010 at 12:24
4в htaccessя прописал так
Redirect 301 /production/catalog/38?PHP=cceddb78b46be00c6584aedfb7acd18b http://www.uvservice.ru/production/catalog/38
но почему-то не работает редирект. Имеет значение где в htaccess стоит эта запись в начале или в конце? а может нужно apach перезапустить?
или может кто знает как сделать 301 аналогичный указному выше редирект используя
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond RewriteRule
</IfModule>
egorch
Июнь 6, 2010 at 15:35
5Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
спасибо за такую абракадабру она действительно работает. Хороший сайт и автору статьи спасибо.
style.ilya
Июнь 13, 2010 at 16:56
6Вот еще полезная штука, как сделать редирект с index.php на корень сайта.
Для редиректа 301 вида “ваш_сайт/index.php” на “http://ваш_сайт/” :
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ http://ваш_сайт/ [R=301,L]
Hmury
Июнь 23, 2010 at 16:56
7Как ни странно, но “Редирект запросов с не-www на домен с www префиксом” не работает так, как нужно… Все замечательно, но при попытке перейти на главную http://site.ru получаем вместо http://www.site.ru адрес http://www.site.ru/site.ru/
А во втором из предложенных вариантов – вообще http://www..com/
Devaka
Июнь 23, 2010 at 17:05
8Hmury, используйте логгинг в мод-реврайте.
httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewriteloglevel
Hmury
Июнь 23, 2010 at 20:36
9Спасибо, разобрался – оказывается это Джумла виновата, точнее sh404sef, установленный на ней. В нем в настройках был забит основной адрес сайта именно без www…
А так все работает без дополнительных изменений.
Devaka
Июнь 29, 2010 at 22:41
10vedroid, в тех вопросах, которые касаются “где я накосячил”, к сожалению, я некомпетентен, так как подробно не знаком с деталями, подобное стоит обсуждать с администратором или запостить на фрилансерский сайт. А также используйте логи.
Nata, это вам решать, как лучше сделать. И в первом и во втором варианте есть свои преимущества и недостатки.
Олег
Июль 17, 2010 at 06:08
11Добрый день всем!
Попробовал все вышеперечисленные методы – не помогает.
А суть в том, чтобы при наборе адреса oooknt.ru открывалась бы страница oooknt.ru/potolki/.
При этом главная страница существует, но для компании приоритет oooknt.ru/potolki/
Игорь
Август 6, 2010 at 12:34
122Михаил
Попробуй так Redirect 301 /support http://www.aloe-systems.com/support/
или RedirectPermanent /support http://www.aloe-systems.com/support/
А если тебе надо весь сайт перенаправить то не заморачивайся с переносом отдельных страниц.
Сашка
Август 21, 2010 at 19:44
13Чпасибо за статью, все грамотно и внятно описано, но я ставил просто на хостинге в панеле управления редтрект со старого домена на новый, и ниче писать не надо было, все и так перешло)
Serj
Октябрь 31, 2010 at 10:29
14из за опр глюков в джумле нужно прописать редирект такого типа в файле .htaccess
есть
/forum/latesttopics/далее любая директория или файл
должен редиректить на
/forum/recent/latesttopics/далее любая директория или файл
Имя
Февраль 7, 2011 at 21:21
15Про ASP.NET чушь написано, правильно: Response.RedirectPermanent();
index
Март 16, 2011 at 18:38
16Спасибо, очень выручили.
В Интернете полно статей с конструкцией
RewriteRule ^(.*)$ http://mysite.ru/$1 [R=301,L]
Это мне никак не подходило, так как .htaccess на десятках сайтов стоит и везде должен быть одинаковый
Только у Вас нашел универсальную конструкцию
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
Жалко только, что наткнулся на Вашу статью только через 3 часа поисков :-(
Руслан
Май 8, 2011 at 16:03
17Огромное спасибо Сергей, попробовал пару вариантов и один из них подошел на все сто %. Мне нужно было что бы все страницы без www переадресовывались на такие же страницы но с www. До этого 3 дня возился с настройками доменов на хостинге и ничего путного – один сайт с первого раза заработала переадресация, а другие хоть … хоть головой об стенку ))
Еще раз спасибо!
Dmitry Paskal
Июнь 29, 2011 at 22:06
18Nginx – нельзя использовать if. Используйте server {}.
черныйСЕО
Октябрь 14, 2011 at 13:01
19Те туфтовые шаболоны, что приведены по ссылке в сообщении 94 – вообще полная лажа. Потому что это не шаблоны (ну кроме общего редиректа с ввв на без-ввв), а вырванные из какого-то ихнего проекта куски кодов редиректа. Мне например ни один не подошел, поэтому нельзя называть это шаблонами. А я очень опрометчиво сначала поставил там +1, а только потом попробовал шаблоны применить которые нифига не работают в моем проекте.
Евгений
Январь 2, 2012 at 15:04
20Отличная подборка вариантов, долго эксперементировал с ними, в итоге установил и склеил домены. Код прописывал в .htaccess, однако само место пришлось подбирать опытным путем, в итоге прописал после #/ end wordpress, и все работает ура!
Роман
Январь 9, 2012 at 17:48
21#Редирект без слеша на слеш. Не трогает расширение.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\..+$
RewriteCond %{REQUEST_URI} !/$
RewriteRule (.*) http://www.site.ru/$1/ [R=301,L]
Алексей
Февраль 24, 2012 at 21:43
22Отличный пост, развёрнутый. У меня проблемка похожего характера, только гугл слопал мой сайт с IP адресом, теперь в результатах поиска два сайта: site.ru и ххх.ххх.хх.99, помогите с правилом RewriteRule на домен. Буду очень благодарен.
алекс
Март 1, 2012 at 15:29
23а у меня беда был сайт в индексе в яндексе все страницы без слеша, потом я поставил сквозную ссылку на главную с каждой страницы со слешем (читал на одном форуме мол без слежа нельзя так ка сильная нагрузка на сервер буде, если будут много пользователей заходить на сайт)
Долго искал в нете инфу про редиректы , нашел это :
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !(.*)/$ RewriteRule ^(.*)$ /$1/ [R=301,L]
сделает редирект на слеш в конце
у меня уже стоит редирект с www.site.ru на site.ru и другой редирект с страницы index.php на морду site.ru
читал могут быть конфликты если много редиректов и они не по порядку стоят не соблюдается синтаксис. Что подскажете?
Дмитрий
Март 3, 2012 at 23:37
24У меня уже давно проиндексированы страницы с index.php и я его буду убирать, но хотелось бы сделать директ:
с http:// сайт .ru/index.php/cat/statyi
на http:// сайт .ru/cat/statyi
Подскажите конструкцию.
Евгений
Март 10, 2012 at 17:21
25Дмитрий:
Redirect 301 /index.php/cat/statyi http://сайт.ru/cat/statyi
вот такой вариант вам подойдет
Игорь
Март 11, 2012 at 13:35
26подскажи как сделать релирект со страницы
http://www.site.ru/index.php?route=common/home
На корень сайта… т.е. на http://www.site.ru/
Такая конструкция:
Redirect 301 /index.php?route=common/home http://www.site.ru/
не канает… Но нужно иметь ввиду что есть страницы вида /index.php?route=что-то/что-то , их не надо редиректить
Adsense Devvver
Март 13, 2012 at 01:40
27style.ilya спасибо большое, единственный вариант, который заработал в связке с редиректом на www Тем кто делает редирект – часто в выдаче лишняя index.html , юзайте вместо php реьд
Василий
Март 14, 2012 at 00:37
28Доброго времени суток!
Помоги пожалуйста! Изменились адреса страниц с fishing на rybalka и т.д., попробовал настроить 301редирект таким образом (и не работает…) :
RewriteEngine On
RewriteCond %{HTTP_HOST} ^fregatastra.ru
RewriteRule (.*) http://www.fregatastra.ru/$1 [R=301,L]
RewriteCond %{HTTP_HOST} ^fregatastra.ru/index.php
RewriteRule (.*) http://www.fregatastra.ru/$1 [R=301,L]
Redirect 301 /fishing.php http://www.fregatastra.ru/rybalka.php
Redirect 301 /about.php http://www.fregatastra.ru/o-baze.php
….
Как сделать чтоб заработало?
Заранее благодарю за ответ!
Игорь
Март 16, 2012 at 16:59
29Спасибо! Очень помог RedirectMatch, когда нужно было все страницы сайта перебрасывать на одну :)
Vovovich
Март 19, 2012 at 02:09
30Всем привет!
Не получается сделать такой редирект.
RedirectMatch 301 /content/%E2%E5%F0%F5%EE%E2%ED%E0%FF-%E6%F0%E8%F6%E0 http://xn——itbab3ajdecpp7dc.xn—p1ai/content/%D0%B2%D0%B5%D1%80%D1%85%D0%BE%D0%B2%D0%BD%D0%B0%D1%8F-%D0%B6%D1%80%D0%B8%D1%86%D0%B0
Перекидывает на 404. Хотя если вместо первого урла указать /content/my-page то работает.
Потапов Александр
Апрель 3, 2012 at 15:31
31у меня на сайте такой редирект <decorator:redirectDeco redirectUri=”/catalog/firebioprotection/” runat=“server”/> т.е. с общей страницы каталога сразу в один из его подразделов. Из-за этого редиректа страничка подраздела не участвует в поиске и не индексируются. Яндекс посоветовал установить 301 но как вот это вопрос ?
Константин
Апрель 4, 2012 at 20:18
32Есть около 15 сайтов, как и где быстро определить стоит ли 301 редирект?
Владимир
Апрель 12, 2012 at 10:23
33Подскажите пожалуйста как сделать 301 редирект.
Нужно чтобы со страниц вида http://мой_сайт/страница1.html?start=300 перекидывало на http://мой_сайт/страница1, а с http://мой_сайт/страница5.html?start=7000 на http://мой_сайт/страница5
Владимир
Апрель 12, 2012 at 12:43
34Я делал так. Прописывал в .htaccess :
Redirect 301 /страница1.html?start=300 http://мой_сайт/страница1
Redirect 301 /страница5.html?start=7000 http://мой_сайт/страница5
и перенаправление шло нормально.
Владимир
Апрель 12, 2012 at 13:16
35Владимир, таких страниц около 1000 штук. Каждую прописывать нереально
Дизайнер
Апрель 12, 2012 at 13:54
36убрать все после знака ?:
RewriteCond %{QUERY_STRING} ^(.+)$
RewriteRule (.+) $1? [R=301,L]
Владимир
Апрель 12, 2012 at 14:19
37Дизайнер, в принципе да
Но не для всех страниц, а только для
http://мой_сайт/страница1
…
http://мой_сайт/страница7
а вот http://мой_сайт/страница9.html?start=3 так и должна остаться
но в любом случае Ваш вариант у меня не работает, выдает 404 страницу
Артем
Апрель 18, 2012 at 17:16
38Не подскажете ли?
Есть очень много ссылок вида http://domen.ru/directory/subdirectory/xxx-yyyy.html где yyyy динамически изменяется, при обращении к ним нужно сделать редирект на http://domen.ru/filename.ext¶m=yyyy не в ручную построчно а с помощью масок, чтоль. В .htaccess
Заранее спасибо!!!
Максим
Апрель 19, 2012 at 23:36
392Дизайнер. Спасибо, работает, долго искал!
Андрей
Апрель 30, 2012 at 18:30
40Здравствуйте Сергей. Прекрасная статья. Есть необходимость использовать редирект , но почему то не получается.
Надо сделать редирект с /shop/index.php?ukey=auxpage_word на /articul/word . mod_alias и mod_rewrite включены. Redirect 301 и RedirectPermanent не срабатывает. php тоже. Подскажите, пожалуйста, что не так?
yeti
Май 3, 2012 at 11:03
41Здравствуйте! подскажите пожалуйста, если добавлять слеши в url, то даже если ввести страницу с не существующим url типа www.site.ru/dfdfdfdf , при проверке ответа сервера всегда будет 301 редирект на страницу со слешем www.site.ru/dfdfdfdf/ вместо ошибки 404. как решить эту проблему и каким то образом сначала проверить на существование страницу,а если ее нет, то только тогда добавлять слеш и делать 301 редирект