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