Редирект 301 на www с помощью htaccess

Онлайн сервисы > Редирект 301 на www с помощью htaccess

Доброго времени суток, читатель. В этой статье я покажу Вам неколько примеров реализации перенаправления, если посетитель приходит на сайт без www, а нужно перевести его на сайт с www. И все это только средствами .htaccess.

Для начала решим простую задачу: посетитель заходит на сайт site.com, нужно, чтобы его перенаправило на сайт www.site.com. Реализуется это следующим образом:


# включаем RewriteEngine
RewriteEngine on

# если HTTP_HOST site.com (значки ^ и $  - начало и конец строки соответственно, [NC] - игнорирование регистра)
RewriteCond %{HTTP_HOST} ^site\.com$ [NC]
# AND REQUEST_URI не равен /robots.txt (обычно требуется, чтобы robots.txt отдавался как c www так и без него, то есть без перенаправления)
RewriteCond %{REQUEST_URI} !^/robots\.txt$
# тогда  для всех запросов делаем 301 редирект
RewriteRule ^(.*)$ http://www.site.com/$1 [R=301,L]

Усложним задачу. Предположим, что site.com и site1.com и site2.com в вашей реализации используют один и тот же сервер и движок. Естественно на сервере они расположены в одной и той же директории, и htaccess у них один и тот же. Каждый домен должен перенаправлять клиентов на свою копию - site.com на www.site.com, site1.com на www.site1.com и так далее. Можно воспользоваться простым примером и решить эту задачу, скопировав несколько раз (простое решение, описанное ранее) одно и то же, указав нужные домены. Но как водится, программисты народ ленивый, поэтому предлагаю более универсальную реализацию.


RewriteEngine on

# если HTTP_HOST *.*
RewriteCond %{HTTP_HOST} ^(.+\..+)$
# и если *.* - не начинается на www.
RewriteCond %1 !^www\. [NC]
RewriteCond %{REQUEST_URI} !^/robots\.txt$
RewriteRule ^(.*)$ http://www.%1/$1 [R=301,L]

Рассмотрим еще одну задачу. Есть сайт site.com и у него есть много поддоменов d1.site.com, d2.site.com, d3.site.com ... dN.site.com. Они также расположены на одном сервере и ссылаются в одну и ту же директорию (такое может встретится в блогодвижках, или например если у сайта представительства в разных регионах, но движок один и тот же). Так вот, необходимо не только каждый домен перенаправлять на www, но и сделать так, чтобы для каждого сайта был свой robots.txt и на такой случай есть решение:


RewriteEngine on

RewriteCond %{HTTP_HOST} ^(.+)?([^\.]\..+)$ [NC]
RewriteCond %1 ^(www\.)?(.+\.)?   [NC]
RewriteCond %2 !^$
RewriteRule ^robots.txt$ /robots.%2txt [L]

RewriteCond %{HTTP_HOST} ^(.+)?([^\.]\..+)$ [NC]
RewriteCond %{REQUEST_URI} !^/robots\.(.*\.)?txt$ [NC]
RewriteCond %1 !^www\. [NC]
RewriteRule ^(.*)$ http://www.%1%2/$1 [R=301,L]

Таким образом зайдя на сайт site.com нас пренаправит на www.site.com, зайдя на site.com/robots.txt мы его и получим, а зайдя на abc.site.com нас перенаправит на www.abc.site.com, но при обращении на abc.site.com/robots.txt нам вернется файл /robots.abc.txt