Доброго времени суток, читатель. В этой статье я покажу Вам неколько примеров реализации перенаправления, если посетитель приходит на сайт без 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