На память

Redirect 301 — разные варианты использования


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

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

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

или

  1. RewriteCond %{REQUEST_URI} ^/page-1/$
  2. 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

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

или

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

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

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

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

или

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

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

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

  1. RewriteCond %{REQUEST_URI} !\?
  2. RewriteCond %{REQUEST_URI} !\&
  3. RewriteCond %{REQUEST_URI} !\=
  4. RewriteCond %{REQUEST_URI} !\.
  5. RewriteCond %{REQUEST_URI} ![^\/]$
  6. 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

  1. RewriteCond %{REQUEST_URI} !\?
  2. RewriteCond %{REQUEST_URI} !\&
  3. RewriteCond %{REQUEST_URI} !\=
  4. RewriteCond %{REQUEST_URI} !\.
  5. RewriteCond %{REQUEST_URI} !\/$
  6. 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Вырезать из URL index.php

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

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

Пример с GET параметрами, например с mysite.com/index.php?value=1&p=3 на mysite.com/?value=1&p=3

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

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

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

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

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

  1. RewriteCond %{REQUEST_URI} !\?
  2. RewriteCond %{REQUEST_URI} !\&
  3. RewriteCond %{REQUEST_URI} !\=
  4. RewriteCond %{REQUEST_URI} !\.
  5. RewriteCond %{REQUEST_URI} !\/$
  6. RewriteCond %{HTTP_HOST} ^www\.(.*)$
  7. RewriteRule ^(.*)$ http://%1/$1/ [L,R=301]
  8.  
  9. RewriteCond %{REQUEST_URI} !\?
  10. RewriteCond %{REQUEST_URI} !\&
  11. RewriteCond %{REQUEST_URI} !\=
  12. RewriteCond %{REQUEST_URI} !\.
  13. RewriteCond %{REQUEST_URI} ![^\/]$
  14. RewriteCond %{HTTP_HOST} ^www\.(.*)$
  15. RewriteRule ^(.*)$ http://%1/$1 [L,R=301]
  16.  
  17. RewriteCond %{REQUEST_URI} !\?
  18. RewriteCond %{REQUEST_URI} !\&
  19. RewriteCond %{REQUEST_URI} !\=
  20. RewriteCond %{REQUEST_URI} !\.
  21. RewriteCond %{REQUEST_URI} !\/$
  22. RewriteCond %{HTTP_HOST} ^([^www].*)$
  23. RewriteRule ^(.*)$ http://%1/$1/ [L,R=301]

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

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

  1. RewriteCond %{REQUEST_URI} !\?
  2. RewriteCond %{REQUEST_URI} !\&
  3. RewriteCond %{REQUEST_URI} !\=
  4. RewriteCond %{REQUEST_URI} !\.
  5. RewriteCond %{REQUEST_URI} !\/$
  6. RewriteCond %{HTTP_HOST} ^www\.(.*)$
  7. RewriteRule ^(.*)$ http://www.%1/$1/ [L,R=301]
  8.  
  9. RewriteCond %{REQUEST_URI} !\?
  10. RewriteCond %{REQUEST_URI} !\&
  11. RewriteCond %{REQUEST_URI} !\=
  12. RewriteCond %{REQUEST_URI} !\.
  13. RewriteCond %{REQUEST_URI} !\/$
  14. RewriteCond %{HTTP_HOST} ^([^www].*)$
  15. RewriteRule ^(.*)$ http://www.%1/$1/ [L,R=301]
  16.  
  17. RewriteCond %{REQUEST_URI} !\?
  18. RewriteCond %{REQUEST_URI} !\&
  19. RewriteCond %{REQUEST_URI} !\=
  20. RewriteCond %{REQUEST_URI} !\.
  21. RewriteCond %{REQUEST_URI} ![^\/]$
  22. RewriteCond %{HTTP_HOST} ^([^www].*)$
  23. RewriteRule ^(.*)$ http://www.%1/$1 [L,R=301]

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

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

  1. RewriteCond %{REQUEST_URI} ^\/$
  2. RewriteCond %{HTTP_HOST} ^([^www].*)$
  3. RewriteRule ^(.*)$ http://www.%1/$1 [L,R=301]
  4.  
  5. RewriteCond %{REQUEST_URI} !\?
  6. RewriteCond %{REQUEST_URI} !\&
  7. RewriteCond %{REQUEST_URI} !\=
  8. RewriteCond %{REQUEST_URI} !\.
  9. RewriteCond %{REQUEST_URI} \/$
  10. RewriteCond %{HTTP_HOST} ^www\.(.*)$
  11. RewriteRule ^(.*)\/$ http://www.%1/$1 [L,R=301]
  12.  
  13. RewriteCond %{REQUEST_URI} !\?
  14. RewriteCond %{REQUEST_URI} !\&
  15. RewriteCond %{REQUEST_URI} !\=
  16. RewriteCond %{REQUEST_URI} !\.
  17. RewriteCond %{REQUEST_URI} !\/$
  18. RewriteCond %{HTTP_HOST} ^([^www].*)$
  19. RewriteRule ^(.*)$ http://www.%1/$1 [L,R=301]
  20.  
  21. RewriteCond %{REQUEST_URI} !\?
  22. RewriteCond %{REQUEST_URI} !\&
  23. RewriteCond %{REQUEST_URI} !\=
  24. RewriteCond %{REQUEST_URI} !\.
  25. RewriteCond %{REQUEST_URI} \/$
  26. RewriteCond %{HTTP_HOST} ^([^www].*)$
  27. RewriteRule ^(.*)\/$ http://www.%1/$1 [L,R=301]

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

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

  1. RewriteCond %{REQUEST_URI} ^\/$
  2. RewriteCond %{HTTP_HOST} ^www\.(.*)$
  3. RewriteRule ^(.*)$ http://%1/$1 [L,R=301]
  4.  
  5. RewriteCond %{REQUEST_URI} !\?
  6. RewriteCond %{REQUEST_URI} !\&
  7. RewriteCond %{REQUEST_URI} !\=
  8. RewriteCond %{REQUEST_URI} !\.
  9. RewriteCond %{REQUEST_URI} \/$
  10. RewriteCond %{HTTP_HOST} ^www\.(.*)$
  11. RewriteRule ^(.*)\/$ http://%1/$1 [L,R=301]
  12.  
  13. RewriteCond %{REQUEST_URI} !\?
  14. RewriteCond %{REQUEST_URI} !\&
  15. RewriteCond %{REQUEST_URI} !\=
  16. RewriteCond %{REQUEST_URI} !\.
  17. RewriteCond %{REQUEST_URI} !\/$
  18. RewriteCond %{HTTP_HOST} ^www\.(.*)$
  19. RewriteRule ^(.*)$ http://%1/$1 [L,R=301]
  20.  
  21. RewriteCond %{REQUEST_URI} !\?
  22. RewriteCond %{REQUEST_URI} !\&
  23. RewriteCond %{REQUEST_URI} !\=
  24. RewriteCond %{REQUEST_URI} !\.
  25. RewriteCond %{REQUEST_URI} \/$
  26. RewriteCond %{HTTP_HOST} ^([^www].*)$
  27. RewriteRule ^(.*)\/$ http://%1/$1 [L,R=301]