Я хотел бы настроить среду, в которой виртуальные хосты Apache могут создаваться динамически без перезагрузки конфигурации.
Я могу сделать это с помощью mod_vhost_alias , я настроил свой виртуальный хост по умолчанию примерно так
<VirtualHost *>
UseCanonicalName Off
VirtualDocumentRoot /var/www/sandboxes/domains/%0
ServerName catchall.host
</VirtualHost>
Это прекрасно работает, но если делается запрос на имя хоста, которое в данный момент не настроено, я получаю ошибку 404 Not Found.
То, что я действительно хотел бы сделать, это включить этот VirtualHost только в том случае, если корень документа существует, в противном случае он попытается сопоставить другой vhost (другими словами, заставить работу VirtualDocumentRoot работать так же, как при использовании ServerAlias)
Я попытался сделать это вторым vhost, при этом первый vhost просто обрабатывал все запросы, но это не сработало - запросы для доменов, в которых был настроен VirtualDocumentRoot, перешли на vhost по умолчанию.
Итак, как я могу динамически настроить vhosts, но с запасным вариантом к другому vhost для любого, который еще не настроен?
источник
Я нашел ваш вопрос, когда гуглил. У меня была точно такая же проблема, и я применил исправление, описанное в ответе Пола . Однако для моего сложного веб-приложения я не был доволен маршрутизацией всех запросов по одному
notfound.php
.В конце концов мне удалось решить проблему без внешних скриптов, только отредактировав мой конфиг VirtualHost.
Сначала мой VirtualHost был настроен так:
У меня были URL, как
client1.domainname.com
,client2.domainname.com
иwhatever.domainname.com
который решил
/mnt/ramdisk/www/cms-client1-development/
,/mnt/ramdisk/www/cms-client2-development/
и/mnt/ramdisk/www/cms-whatever-development/
Тем не менее, URL-адрес вроде
nonexistent.domainname.com
бы дал мне 404, потому что каталог/mnt/ramdisk/www/cms-nonexistent-development/
не существует. Я хотел, чтобы эти субдомены использовали каталог/mnt/ramdisk/www/cms-default-development/
Я исправил это с помощью
ModRewrite
иModProxy
:Для этого нужно: захватить поддомен (часть перед ним
.domainname.com
), вставить его в путь (% 1) и прокси-сервер запрашивает URL-адрес по умолчанию, только если каталог не существует.Используя прокси, процесс прозрачен, и пользователь думает, что он посещает http://nonexistent.domainname.com , в то время как он фактически просматривает контент с http://default.domainname.com/ .
источник
Я также натолкнулся на этот вопрос, прибегая к помощи по поиску динамического резервного файла apache2, и ответ Люка мне очень помог в решении моей проблемы, но я все еще хочу показать, что я сделал для достижения своих целей, главным образом потому, что это включало некоторые дополнительные работы и потому, что я думаю, что это может быть полезным для любых будущих гуглеров ...
Мои цели
foo.com
должен обслуживать тот же контент, что иwww.foo.com
foo.com
до,www.foo.com
еслиwww
он недоступен, вместо этого откат к умолчаниюDNS
У меня есть пара доменов (и всех их поддоменов), указывающих на мой VPS, например:
Файловая система
У меня есть следующие каталоги, домены содержат каталоги с именами доступных поддоменов, требуется каталог www, но конфигурация должна быть в состоянии справиться с ситуацией, когда ее нет. Localhost используется как запасной вариант по умолчанию:
тесты
Перевод моих целей в проверяемые случаи:
Решение
Это использование:
mod_rewrite
,mod_proxy_http
и конечноmod_vhost_alias
.Как это работает? Определены три виртуальных хоста:
локальный
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
только подстановочные.%n
ВVirtualDocumentRoot
это от имени документа интерполяции .%n
второмRewriteCond
относятся к выборам(.*)
из первогоRewriteCond
, например. части запрашиваемого домена.%n
ВRewriteRule
тоже.$1
ВRewriteRule
относится к выбору(.*)
в началеRewriteRule
. Который захватывает все от домена до?
URL-адреса в запросе. Любая строка запроса автоматически добавляется в URLmod_proxy
.источник
Просто добавив его, я получаю тот же результат (за исключением перенаправления localhost), что и RemyNL, но также включаю IP-адрес при подключении напрямую:
источник