Я также натолкнулся на этот вопрос, прибегая к помощи по поиску динамического резервного файла apache2, и ответ Люка мне очень помог в решении моей проблемы, но я все еще хочу показать, что я сделал для достижения своих целей, главным образом потому, что это включало некоторые дополнительные работы и потому, что я думаю, что это может быть полезным для любых будущих гуглеров ...
Мои цели
- динамический хостинг для всех доменов и поддоменов, указывающих на мой VPS
foo.com должен обслуживать тот же контент, что и www.foo.com
- запасной вариант для неизвестных доменов по умолчанию
- откат для неизвестных поддоменов
foo.comдо, www.foo.comесли wwwон недоступен, вместо этого откат к умолчанию
DNS
У меня есть пара доменов (и всех их поддоменов), указывающих на мой VPS, например:
- foo.com
- bar.com
- foobar.com
Файловая система
У меня есть следующие каталоги, домены содержат каталоги с именами доступных поддоменов, требуется каталог www, но конфигурация должна быть в состоянии справиться с ситуацией, когда ее нет. Localhost используется как запасной вариант по умолчанию:
/var
/www
/localhost
/foo.com
/www
/bar
/bar.com
/foo
тесты
Перевод моих целей в проверяемые случаи:
- foo.com должен быть подан с foo.com/www
- www.foo.com должен быть подан с foo.com/www
- bar.foo.com должен быть подан с foo.com/bar
- foo.foo.com должен быть подан с foo.com/www (foo.com/foo не существует)
- bar.com должен обслуживаться с localhost (bar.com/www не существует)
- www.bar.com должен обслуживаться с localhost (bar.com/www не существует)
- foo.bar.com должен быть подан с bar.com/foo
- bar.bar.com должен обслуживаться с localhost (bar.com/bar не существует)
- foobar.com должен обслуживаться с локального хоста (foobar.com не существует)
- www.foobar.com должен обслуживаться с localhost (foobar.com не существует)
- foo.foobar.com должен обслуживаться с локального хоста (foobar.com не существует)
Решение
Это использование: mod_rewrite, mod_proxy_httpи конечно mod_vhost_alias.
ServerName my.domain
ServerAdmin admin@my.domain
<VirtualHost *:80>
ServerName localhost
VirtualDocumentRoot /var/www/localhost
</VirtualHost>
<VirtualHost *:80>
ServerName sub.domain
ServerAlias *.*.*
VirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
RewriteCond /var/www/%2.%3 !-d
RewriteRule (.*) http://localhost/$1 [P]
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
RewriteCond /var/www/%2.%3/%1 !-d
RewriteCond /var/www/%2.%3/www !-d
RewriteRule (.*) http://localhost/$1 [P]
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
RewriteCond /var/www/%2.%3/%1 !-d
RewriteRule (.*) http://%2.%3/$1 [P]
</VirtualHost>
<VirtualHost *:80>
ServerName bare.domain
ServerAlias *.*
VirtualDocumentRoot /var/www/%-2.0.%-1.0/www
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)$ [NC]
RewriteCond /var/www/%1.%2 !-d [OR]
RewriteCond /var/www/%1.%2/www !-d
RewriteRule (.*) http://localhost/$1 [P]
</VirtualHost>
Как это работает? Определены три виртуальных хоста:
локальный
Localhost служит по умолчанию. Все неразрешимые запросы обслуживаются localhost. Настройка символической ссылки с localhost на любой из ваших доменов аналогична настройке этого сайта по умолчанию.
sub.domain
Sub.domain vhost принимает все запросы в форме *.*.*. По умолчанию все запросы обслуживаются /domain.com/subкак определено VirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3.
отступать:
Первый RewriteRuleзаботится о неизвестных доменах, например. domain.comКаталог не существует, путем прокси на сайте localhost.
Второй RewriteRuleтакже проксирует localhost, когда domain.com/subи domain.com/wwwкаталоги, и каталоги отсутствуют.
Третий RewriteRuleпрокси, domain.comкогда domain.com/subне существует. Мы знаем, domain.com/wwwчто существует из-за второго блока перезаписи.
bare.domain
Хостинг bare.domain принимает *.*запросы и обслуживает их./domain.com/www
Здесь RewriteRuleбудет прокси для localhost, когда domain.comили domain.com/wwwне существует.
^ $%. * !!!
У меня были некоторые проблемы с тем, чтобы обернуть голову вокруг всех этих знаков $и %знаков, RewriteCondи RewriteRuleпоэтому я объясню о них здесь:
ServerAlias *.*.*
VirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
RewriteCond /var/www/%2.%3/%1 !-d
RewriteRule (.*) http://%2.%3/$1 [P]
*В ServerAliasтолько подстановочные.
%nВ VirtualDocumentRootэто от имени документа интерполяции .
- Во
%nвтором RewriteCondотносятся к выборам (.*)из первого RewriteCond, например. части запрашиваемого домена.
%nВ RewriteRuleтоже.
$1В RewriteRuleотносится к выбору (.*)в начале RewriteRule. Который захватывает все от домена до ?URL-адреса в запросе. Любая строка запроса автоматически добавляется в URL mod_proxy.