Redirect 301 — разные варианты использования
301 редирект с одной страницы на другую
Используется когда страница переехала с одного URL на другой. Например старый URL страницы /page-1/ необходимо сделать 301 редирект на URL http://mysite.com/new-page-1/
- Redirect 301 /page—1/ http://mysite.com/new-page-1/
или
- RewriteCond %{REQUEST_URI} ^/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, например /may-best-page и /my-best-page/, если человеку понятно что это одна и та же страница, то поисковые системы понимают это как две разные страницы, соответственно разбивают вес страницы, а также показываются в аналитике (статистике) как 2 разные страницы. Для того, что бы избежать этого вы можете сделать 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
Причина делать такой редирект та же, что и в ситуации описанным выше, за исключением того, что редирект необходимо делать со страницы без слеша в конце URL на страницу со слешем в конце 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=1&p=3 на mysite.com/?value=1&p=3
- 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]