вторник, 28 июля 2009 г.

.htaccess и поддомены (sudomains)

Господи, как же давно тут не был. Буду теперь пользовать сие детище web-индустрии.

Основная причина, для которой используется подобная возможность Apache и .htaccess - это возможность использования неограниченного количества поддоменов, считая, что каждая папка с контентом в заранее обусловленной, является поддоменом. Например, (тут и далее будут приводиться реальные примеры) есть сайт pfo.su, в нем есть папка cities, в которой куча других папок (kirov, kazan и тд), их и надо сделать поддоменами. Т.е. kirov.pfo.su на самом деле является pfo.su/cities/kirov/.
Спасибо этой статье за подкинутую мысль.
Решение проблемы оказалось элементарным. Нужно было лишь в файле .htaccess, находящемся в корне pfo.su, прописать следующее:

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} !^/cities
RewriteCond %{HTTP_HOST} !^www\.pfo\.su$ [NC]
RewriteCond %{HTTP_HOST} ^(www\.)?(.*)\.pfo\.su$ [NC]
RewriteRule ^(.*)$ cities/%2/$1

Где:
RewriteEngine On [включаем движок перезаписи]
RewriteBase / [указываем, что перезапись будет производиться в текущем каталоге]
RewriteCond %{REQUEST_URI} !^/cities [отклоняем прямые запросы в папку cities с поддоменами]
RewriteCond %{HTTP_HOST} !^www\.pfo\.su$ [NC] [указываем, что правила действуют только для сайтов на поддоменах, а не на самом pfo.su]
RewriteCond %{HTTP_HOST} ^(www\.)?(.*)\.pfo\.su$ [NC] [проверяем, идет ли запрос на поддомен]
RewriteRule ^(.*)$ cities/%2/$1 [выдаем контент из папки поддомена, название которого берем из вторых скобок предыдущего выражения, его дописываем к запросу в папку cities и в самый конец приписываем сопсно сам URI]

Вот и все.

1 комментарий:

Unknown комментирует...

У меня практический вопрос, данное прописывание - работает. Но возникает одна сложность. Во всех поддоменах меняется корень и если для домена первого уровня example.com корень, например выглядит /home/example.com/
то для поддомена ru.example.com корень уже будет /home/example.com/ru/
А неудобство в том, что все картинки css и js файлы ищутся в соответствии с новым корнем.
Как прописать всем поддоменам единый корень?

P.S. RewriteBase / не принимает пишет при попытке перезапуска апача:
"RewriteBase: only valid in per-directory config files"