Создание wildcard-записи DNS
Первый шаг состоит в создании wildcard-записи DNS. Для разных DNS-серверов это будет осуществляться по-разному (в смысле, принцип один и тот же, различия лишь в синтаксисе конфигурационного файла). Рассмотрим на примере BIND (так как BIND работает и под Linux/UNIX, и под Windows).
Создание wildcard-записи очень просто: всё, что нужно — это добавить A-запись, связывающую имя вида *.domain.tld с IP-aдресом сервера.
Рассмотрим на примере одного development-сервера:
$TTL 86400
$ORIGIN somesite.tld.
@ 1D IN SOA ns1.somesite.tld. root.somesite.tld. (
2008030500 ; serial
24H ; refresh
15 ; retry
90w ; expire
15 ; minimum
)
IN NS ns1
IN NS ns
IN MX 10 @
IN A 10.0.0.1
ns1 IN A 10.0.0.1
ns IN A 10.0.1.1
www IN A 10.0.0.1
Мы видим, что домен test.ru "живёт" по адресу 10.0.0.1; там же находятся два его поддомена — ns1.somesite.tld и www.somesite.tld (технически www.somesite.tld является поддоменом somesite.tld; в общем случае www.somesite.tld и somesite.tld могут быть совершенно разными сайтами).
На сайт был поставлен WordPress µ, вследствие чего нужно было создать общий поддомен — чтобы каждый пользователь получал блог вида username.somesite.tld.
Добавление общего поддомена сводится к добавлению A-записи в конец файла зоны:
*.somesite.tld. IN A 10.0.0.1
После чего нужно было перезапустить BIND.
После перезапуска придётся подождать некоторое время, пока новые настройки DNS "распространятся" через Internet (этот феномен называется DNS propagation).
Настройка виртуального хоста Apache
После того, как мы успешно настроили DNS, нужно указать Apache, что он должен обрабатывать адреса вида *.domain.tld .
Пусть в файле конфигурации у нас есть такая запись о виртуальном хосте:
<VirtualHost *:80>
DocumentRoot "/home/somesite.tld"
ServerName "somesite.tld"
ErrorLog logs/somesite.tld.ua-error.log
CustomLog logs/somesite.tld-access.log common
VirtualHost>
Всё, что нам надо — это добавить еще один псевдоним (alias) в директиву ServerAlias:
ServerAlias "somesite.tld" "*.somesite.tld"
После внесения изменений Apache нужно перезапустить.