У меня есть следующее в apache.conf на моей рабочей станции разработки (фактически включено из /etc/apache2/users/andrew.conf):
<Directory "/Users/andrew/Sites/">
Options Indexes MultiViews
AllowOverride All
Order allow,deny
Allow from all
</Directory>
<VirtualHost *:80>
DocumentRoot /Users/andrew/Sites/mysite/public
ServerName mysite.dev
</VirtualHost>
Я полагаюсь на настройки по умолчанию в моей новой установке Mac OS X Lion и просто добавляю директиву VirtualHost.
Когда я получу http: // локальный / ~ Андрей / Он не пытается обслуживать стандартный индекс каталога, вместо этого он пытается обслуживать VirtualHost. Я ожидал, что это произойдет только при доступе к нему через ServerName "mysite.dev".
Если я удалю VirtualHost, он будет правильно обслуживать индекс каталога.
Есть идеи, почему это может происходить?
Обновить: Я обнаружил, что если я перенесу директиву VirtualHost из users / andrew.conf в extra / http-vhosts.conf, то она будет работать правильно. Я полагаю, это отвечает на мой вопрос, но я все еще не понимаю первопричину:
## httpd.conf
Include /private/etc/apache2/extra/httpd-userdir.conf
Include /private/etc/apache2/extra/httpd-vhosts.conf
## extra/http-userdir.conf
UserDir Sites
Include /private/etc/apache2/users/*.conf
<IfModule bonjour_module>
RegisterUserSite customized-users
</IfModule>
## extra/httpd-vhosts.conf
NameVirtualHost *:80
Конфигурация выглядит так, как будто они должны загружать одно и то же, поэтому я не понимаю, почему это будет иметь значение, определен ли мой VirtualHost в extra / httpd-vhosts.conf или в моих собственных пользователях / andrew.conf
Обновление 2: В дополнительном файле / httpd-vhosts.conf я закомментировал «пример» VirtualHosts, который указывает на несуществующий DocumentRoots. Вернув эти примеры, мои обычные каталоги теперь работают должным образом, не попадая в первый универсальный VirtualHost.
Итак, реальный вопрос: зачем конфигурации apache нужен недопустимый VirtualHost, чтобы это работало?
Только запросы, которые не соответствуют ни одному из IP и порта, указанных в объявлениях, обрабатываются основным невиртуальным хостом.
При выборе виртуального хоста, который будет использоваться для обслуживания запроса, Apache работает следующим образом:
Следовательно, если вы укажете Listen 80
и <VirtualHost *:80>
директивы в вашей конфигурации, это означает, что невиртуальный хост, возможно, не может быть использован, потому что все, что мы слушаем, будет перехвачено этим виртуальным хостом, и даже если ServerName на этом виртуальном хосте не совпадает, он все равно будет сопоставлен с ним в соответствии с моим правилом 5 .
Решение - сменить ваш основной невиртуальный хост на виртуальный. Положив <VirtualHost *:80>
объявления вокруг директивы DocumentRoot для основного хоста должно быть достаточно.
Вы можете прочитать об этом больше в документации Apache на Поддержка виртуального хоста на основе имени. Проверьте особенно Главный хозяин уходит нота.