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