Редиректы 301 с помощью .htaccess, варианты, правила, советы и примеры

Редирект 301 , это для страниц перемещенных навсегда, когда страница перемещена на новый адрес, а старый URL планируется уже никогда не использовать. Редирект будет передавать примерно 99% ссылочного веса страницы.

Советы и примеры 301-го редиректа с помощью файла .htaccess

Редирект 301 должен переадресовываться на существующую страницу у которой ответ сервера равен 200.

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

Проверять Редирект 301 надежнее с помощью онлайн ресурсов, т.к. браузеры могут кэшировать редиректы.

Содержание

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

Используется тогда, когда страница переехала с одного URL на другой. Например старый URL страницы /old-page-1/ необходимо сделать Редирект 301 на URL http://mysite.com/new-page-1/

Redirect 301 /old-page-1/ http://mysite.com/new-page-1/

или можно так:

RewriteCond %{REQUEST_URI} ^/old-page-1/$
RewriteRule ^.*$ http://mysite.com/new-page-1/? [R=301,L]

 

Редирект 301 с www на домен без www

Редирект 301 домена с www на без www по другому может называться склейкой домена или канонизацией домена. Если делать редирект с http://www.mysite.com на http://mysite.com, главное зеркало сайта это http://mysite.com

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

или

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

Редирект 301 с домена без www на домен с www

Также как и в случае описанным выше это еще называется канонизацией домена или его склейкой. Например Редирект 301 с домена http://mysite.com на домен http://www.mysite.com. Главное зеркало это www.mysite.com

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

или

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

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

Часто бывает так что одна и та же страница доступна по двум URL, например /my-best-page и /my-best-page/, если человеку может быть понятно что это одна и та же страница, то поисковые системы понимают это как две разные страницы, показываются в аналитике и статистике такие страницы как две разные и самое главное разбивается вес самой страницы.

Для того, что бы избегать подобного, необходимо сделать Редирект 301 со страниц со слешем в конце URL на вариант без него, как в примерах ниже:

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

Такой редирект будет работать следующим образом:

Запрос (URL)                                            Редирект (URL)

http://mysite/page/                                 http://mysite/page
http://mysite/page/?value=1                 http://mysite/page?value=1
http://mysite/page.html/                       http://mysite/page.html
http://mysite/page?value=1/                 http://mysite/page?value=1
http://mysite/page                                  без редиректа
http://mysite/page.html                        без редиректа
http://mysite/page?value=1                  без редиректа 

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

Необходимость делать такой редирект точно такая  же, что и в предыдущем примере:

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

Пример работы этого редиректа:

Запрос (URL)                                          Редирект (URL)
http://mysite/page                                 http://mysite/page/
http://mysite/page.html                       http://mysite/page.html
http://mysite/page?value=1                http://mysite/page/?value=1
http://mysite/page/ без                       редиректа
http://mysite/page/?value=1              без редиректа

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

 

Например ситуация, когда вам нужно сделать Редирект 301 с любого URL текущего сайта (к которому относиться .htaccess) на домен http://mysite.com

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

Редирект 301 с каждой страницы одного домена на такой же URL адрес другого домена

Рассмотрим следующую ситуацию, когда ваш сайт переехал на новый домен, но у вас есть план сохранить пользователей переходящих по старым ссылкам и открывать сайт на новом домене с запрашиваемыми пользователем страницами.

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

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

Однако, если у вас на домене присутствует SSL сертификат и работает протокол https, то для редиректа 301 будет нужно добавить в .htaccess следующий код:

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

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

И пример обратной ситуации, когда у вас нет SSL сертификата и протокол https не работает:

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

Удаляем несколько слешей подряд в URL и делаем Редирект 301

Если вдруг у вас появились URL такого вида: mysite.com/page///my-page, то необходимо сделать 301-й редирект без дублирования этих слешей:

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

Удаляем подряд несколько тире (дефисов) и делаем Редирект 301

Как и в ситуации с несколькими слешами в URL может появиться несколько дефисов, для 301-го редиректа с их удалением добавляем код:

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

Вырезаем из URL название файла index.php

Пример без GET параметров, например с mysite.com/index.php на mysite.com/

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

А теперь вариант с GET параметрами, например с mysite.com/index.php?value=21&p=6 на mysite.com/?value=21&p=6

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

Несколько примеров совмещения 2-х редиректов в один

Для предотвращения последовательных редиректов можно использовать совмещенные варианты.

Редирект 301 с www на без www и со слешем в конце URL

Комбинируем редирект 301 с www на домен без www и Редирект 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 с без www на с www и со слешем в конце URL

Комбинируем Редирект 301 с домена без www на домен с www и Редирект 301 со страниц без слеша на страницы со слешем в конце URL

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 на с www и без слеша в конце URL

Комбинируем редирект 301 с домена без www на домен с www и редирект 301 со страниц со слешем на страницы без слеша в конце URL

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 на без www и без слеша в конце URL

Комбинируем Редирект 301 с www на домен без www и Редирект 301 со страниц со слешем на страницы без слеша в конце URL

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]