Редирект 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]