Динамическое создание субдоменов: никакой магии!

Apr 07, 2008 22:48


Originally published at Точка с запятой;. You can comment here or there.
The Sydney Domain.



Сиднейская Долина, основанная в 1788 году, - одно из самых привлекательных для фотографов мест в Сиднее. Вот уж не думал, что обыденное слово «domain» может означать такую красоту.
Загадка природы

Когда я впервые увидел хабр - меня очень сильно заинтересовала техника динамического создания субдоменов на каждого юзера. Год назад для меня это казалось, по меньшей мере, магией. Тогда я поискал ответы в яндексе и гугле, не нашел ничего путного и забыл про это дело.
Второе пришествие
Определение слова «wildcard».

Поскольку мне и для диплома в универе, и для проектных нужд надо написать свой движок социалки - вопрос с динамическими субдоменами снова встал. В этот раз решение было найдено легко! Называется эта техника «wildcard hosting».

Для динамического создания субдоменов необходимо настроить DNS, Apache и mod_rewrite (хотя я знаю, как можно и без него, но об этом далее).
DNS

Даже m. нынче предоставляет простым смертным (пользователям виртуального хостинга) копошиться в настройках DNS для своих доменов. Для того, чтобы обеспечить wildcard, надо создать всего одну строчку:

*.example.com IN A 192.168.1.1
Угадай сам, как составить нужную строку для своего любимого домена.
Apache

С настройками Apache всё может быть не так просто: по крайней мере, на виртуальном хостинге вряд ли дадут покопаться в папке /etc/apache2/vhosts.d/. Хотя, всё бывает, может быть, я чего-то и не знаю в этом мире 8)

В общем, если у тебя есть доступ к конфигам виртуальных хостов Apache, то тебе надо добавить в конфиг нужного домена всего одну строку. Например, так:

ServerName www.example.com ServerAlias *.example.com   DirectoryIndex index.html DocumentRoot /home/www/www.example.com/htdocs   ...
Да-да, именно ServerAlias делает всю погоду в настройках веб-сервера.
Mod_rewrite

Товарищи буржуи предлагают выделять динамические субдомены на уровне mod_rewrite и направлять в ссылку как обычный параметр. Может быть, где-то это и удобно, но wildcards тем и хороши, что добавляют еще одну степень свободы для формирования URL. Все равно, опишу этот метод.

В корень папки сайта нужно поместить файл .htaccess с такими строками:

RewriteEngine on RewriteCond %{http_host} . RewriteCond %{http_host} !^www.example.com [NC] RewriteCond %{http_host} ^([^.]+)\.example.com [NC] RewriteRule ^(.*) http://www.example.com/%1/ [R=301,L,QSA]
Первая строка включает mod_rewrite, вторая для меня неизвестная, третья предотвращает переписывание www.example.com в example.com/www/, четвертая выдергивает псевдосубдомен, а пятая помещает его в конец ссылки.

При таком раскладе все обращения к серверу вида subdomain.example.com приведутся к example.com/subdomain/.
PHP
Основа кода - bigstreet.

PHP я взял, исходя из простоты и популярности. Распарсить HTTP_HOST можно на любом языке серверного программирования.

Итак, если ты хочешь больше степеней свободы, то вместо редактирования .htacces тебе надо дописать несколько строк в PHP-скрипт. В самом начале обработки юзерского запроса надо написать такой код:

$pathWeb = 'http://example.com';   $pathClear = preg_replace("/\/?$/", "", preg_replace("/^http:\/\//", "", $pathWeb)); if($_SERVER['HTTP_HOST'] != 'www.'.$pathClear and $_SERVER['HTTP_HOST']!= $pathClear) { $subdomain = preg_replace("/\.".$pathClear.".?$/", "", $_SERVER['HTTP_HOST']); }
И тогда в переменной subdomain окажется название субдомена. Делай с ним все, что хочешь.
PS

В следующий раз я хочу рассказать тебе про самый легкий способ кросс-доменного аякса и про гаджеты гугла.

С любовью, Юра.

Занимательное :), Берем уроки

Previous post Next post
Up