2013-05-22 2 views
0

У меня есть несколько сайтов, настроенных как VirtualHost. Все они работают в одной системе, одинаковом IP-адресе. Я хочу, чтобы apache перенаправлял запросы к одному или другому VirtualHost на основе DNS. Вот почему я использую ServerName. Цитирование:Почему имя_сервера не имеет никакого эффекта?

Если вы используете имя на основе виртуальных хостов, то ServerName внутри секции определяет, какие имена хостов должны появляться в хост в запрос по: заголовок, чтобы соответствовать этому виртуального хоста.

Это как моя виртуальная конфигурация хоста выглядит следующим образом:

NameVirtualHost *:80 
<VirtualHost *> 

    ServerName my.dns.net 

    .... 

</VirtualHost> 

Но апача, вместо Maching запросы в соответствии с DNS, просто перенаправлять запросы к первому VirtualHost определены.

  • Почему?
  • Что я могу сделать, чтобы заставить apache выполнять точное сопоставление DNS?
+0

У вас есть все разные имена серверов, установленные в вашем файле DNS/hosts? Это обязательно! – Jensd

+0

Конечно, конечно. Имена серверов активны. – dangonfast

ответ

1

Следующая директива сообщает apache, что вы собираетесь использовать виртуальные хосты на основе имени.

NameVirtualHost *:80 

Если посмотреть на пример в Апач документы:

http://httpd.apache.org/docs/2.2/vhosts/name-based.html

Вы можете увидеть, что оно определено перед VirtualHosts. Это имеет смысл, поскольку до тех пор, пока эта директива не будет обработана, Apache не знает, что вы собираетесь использовать виртуальные хосты на основе имени.

Важно понимать порядок, в котором Apache обрабатывает файлы conf. Если вы посмотрите в вашем apache2.conf, вы увидите этот код:

# Include module configuration: 
Include mods-enabled/*.load 
Include mods-enabled/*.conf 

# Include all the user configurations: 
Include httpd.conf 

# Include ports listing 
Include ports.conf 

(...) 

# Include generic snippets of statements 
Include conf.d/ 

# Include the virtual host configurations: 
Include sites-enabled/ 

Таким образом, порядок обработки:

apache2.conf -> Модули Apache -> httpd.conf -> ports.conf -> любой .conf-файл, присутствующий в /etc/apache2/conf.d/ -> наконец (в алфавитном порядке) ваши файлы confHists.

В коде вы определили Директиву в файле conf.ini, но у вас могут быть другие VirtualHosts до этого. Таким образом, по мере того, как Apache читает файлы confHists в alfabethical order, он может прочитать другой файл conf в VirtualHost перед разбором директивы NameVirtualHost *: 80, и поэтому он не будет читать следующие файлы confHist.

Решение состоит в том, чтобы определить эту директиву где-либо перед файлами confhost. Я думаю (хотя я не уверен на 100%), что в Ubuntu Server стандартным способом является определение этой строки в файле /etc/apache2/ports.conf, который, как объяснялось ранее, считывается перед всеми виртуальными хостами в/etc/apache2/sites -avalaible. Таким образом, Apache будет знать, что у вас есть ServerNames, и попробуйте каждый виртуальный хост, прежде чем вернуться к первому (по умолчанию).

Смежные вопросы