Базовые правила редиректов для .htaccess

Базовые правила редиректов для .htaccess

Леонид Суматохин

При создании сайта, при прочих равных, важно решить несколько задач, связанных с оптимизацией работы сайта, улучшением взаимодействия пользователей с контентом и поддержкой SEO (поисковая оптимизация). И часть таких задач можно решить с помощью корректной настройки правил редиректов.

Эти правила редиректов в большинстве случаев носят хрестоматийный характер, качуют из проекта в проект, но мной постоянно и благополучно забываемые. А посему зафиксируем для истории в качестве шпаргалки.

Настройка основного зеркала.

При поисковой оптимизации сайта, важно, что бы сайт был доступен по уникальному адресу – так называемому основному зеркалу. Как правило, в качестве основного зеркала сайта выбираются адреса site.ru или www.site.ru, а для другого прописывается редирект.

# Редирект www.site.ru -> site.ru
RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
# Редирект www.site.ru -> site.ru

Или же обратный вариант

# Редирект site.ru -> www.site.ru 
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} (.+)$
RewriteRule ^(.*)$ https://www.%1/$1 [R=301,L] . 
# Редирект site.ru -> www.site.ru

Важно! Не стоит использовать оба варианта сразу ;)


Настройка перенаправлений HTTP -> HTTPS

Современный сайт без поддержки https – это архаизм, но нам важно убедиться, что и динозывры смогут посмотреть сайт.

# Редирект с http на https
RewriteCond %{HTTPS} off
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Редирект с http на https

На самом деле, вариантов редиректов http -> https существует несколько и на различных хостингах правила могут отличаться.


Борьба с адресами дубликатами

Я уже ранее упоминал, что одна из задач, которую мы решаем при помощи редиректов – это поисковая оптимизация. Согласно требованиям seo-оптимизации у каждой страницы должен быть только один уникальный адрес, а поэтому рассмотрим ряд правил, которые позволяют нам этого добиться.


# Редирект с index.php на конце
RewriteCond %{REQUEST_URI} ^(.*)/index\.php$
RewriteRule ^(.*)index\.php$ https://%{HTTP_HOST}/$1 [R=301,L]
# Редирект с index.php на конце

 

# Редирект на страницу без многократных / 
RewriteCond %{REQUEST_URI} ^(.*?)\/{2,}(.*?)$
RewriteRule . %1/%2 [L,R=301]

RewriteCond %{THE_REQUEST} //
RewriteRule .* /$0 [R=301,L]
# Редирект на страницу без многократных /

 

# Редирект для адресов с заглавными буквами
RewriteRule [A-Z] - [E=HASCAPS:TRUE,S=1]
RewriteRule ![A-Z] - [S=28]
RewriteRule ^([^A]*)A(.*)$ $1a$2
RewriteRule ^([^B]*)B(.*)$ $1b$2
RewriteRule ^([^C]*)C(.*)$ $1c$2
RewriteRule ^([^D]*)D(.*)$ $1d$2
RewriteRule ^([^E]*)E(.*)$ $1e$2
RewriteRule ^([^F]*)F(.*)$ $1f$2
RewriteRule ^([^G]*)G(.*)$ $1g$2
RewriteRule ^([^H]*)H(.*)$ $1h$2
RewriteRule ^([^I]*)I(.*)$ $1i$2
RewriteRule ^([^J]*)J(.*)$ $1j$2
RewriteRule ^([^K]*)K(.*)$ $1k$2
RewriteRule ^([^L]*)L(.*)$ $1l$2
RewriteRule ^([^M]*)M(.*)$ $1m$2
RewriteRule ^([^N]*)N(.*)$ $1n$2
RewriteRule ^([^O]*)O(.*)$ $1o$2
RewriteRule ^([^P]*)P(.*)$ $1p$2
RewriteRule ^([^Q]*)Q(.*)$ $1q$2
RewriteRule ^([^R]*)R(.*)$ $1r$2
RewriteRule ^([^S]*)S(.*)$ $1s$2
RewriteRule ^([^T]*)T(.*)$ $1t$2
RewriteRule ^([^U]*)U(.*)$ $1u$2
RewriteRule ^([^V]*)V(.*)$ $1v$2
RewriteRule ^([^W]*)W(.*)$ $1w$2
RewriteRule ^([^X]*)X(.*)$ $1x$2
RewriteRule ^([^Y]*)Y(.*)$ $1y$2
RewriteRule ^([^Z]*)Z(.*)$ $1z$2
RewriteRule [A-Z] - [N]
RewriteCond %{ENV:HASCAPS} TRUE
RewriteRule ^/?(.*) /$1 [R=301,L] 
# Редирект для адресов с заглавными буквами

Так же, в зависимости от требований, может понадобится такой редирект.

# Редирект с адреса без слеша на слеш /
RewriteCond %{REQUEST_URI} (.*/[^/.]+)($|\?)
RewriteRule .* %1/ [R=301,L]
# Редирект с адреса без слеша на слеш /

Report Page