Назад | Перейти на главную страницу

VirtualHost берет на себя управление Каталогом без имени хоста в запросе

У меня есть следующее в 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 работает следующим образом:

  1. Он фильтрует виртуальные хосты с соответствующими IP-адресом и портом.
  2. ЕСЛИ совпадений не найдено, используется невиртуальный хост по умолчанию.
  3. ЕСЛИ найдено одно совпадение, оно используется.
  4. ЕСЛИ найдено более одного совпадения, используется первое из них, которое также соответствует в ServerName или ServerAlias.
  5. ЕСЛИ было найдено более одного совпадения, но впоследствии совпадение в ServerName или ServerAlias ​​не могло быть установлено, используется первый виртуальный хост, соответствующий IP-адресу и порту.

Следовательно, если вы укажете Listen 80 и <VirtualHost *:80> директивы в вашей конфигурации, это означает, что невиртуальный хост, возможно, не может быть использован, потому что все, что мы слушаем, будет перехвачено этим виртуальным хостом, и даже если ServerName на этом виртуальном хосте не совпадает, он все равно будет сопоставлен с ним в соответствии с моим правилом 5 .

Решение - сменить ваш основной невиртуальный хост на виртуальный. Положив <VirtualHost *:80> объявления вокруг директивы DocumentRoot для основного хоста должно быть достаточно.

Вы можете прочитать об этом больше в документации Apache на Поддержка виртуального хоста на основе имени. Проверьте особенно Главный хозяин уходит нота.