Почему Apache может игнорировать виртуальный хост с именем ServerName, соответствующим запрошенному URL?


26

Я пытаюсь добавить второй виртуальный хост в мою конфигурацию apache, но не могу получить новый виртуальный хост для использования.

Мой httpd.confпросто содержит следующую строку:

ServerName radiofreebrighton.org.uk

У меня также есть ports.confфайл, который содержит следующее:

NameVirtualHost *:80
Listen 80

<IfModule mod_ssl.c>
    Listen 443
</IfModule>

У меня есть два файла , в sites-availableкоторых слинкованы в sites-enabledпо a2ensite:

  • radiofreebrighton.org.uk
  • trafalgararches.co.uk

Содержание первого:

<VirtualHost _default_:80>
    DocumentRoot /home/tom/www

    ServerAdmin tom@radiofreebrighton.org.uk
    ServerName radiofreebrighton.org.uk
    ServerAlias www.radiofreebrighton.org.uk

    <Directory /home/tom/www/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride All
            Order allow,deny
            allow from all
    </Directory>

    ErrorLog /var/log/apache2/error.log
    LogLevel error
    CustomLog /var/log/apache2/access.log combined

    Alias /wiki /home/tom/www/mediawiki/index.php
</VirtualHost>

Содержание последнего:

<VirtualHost *:80>
    DocumentRoot /home/tom/tata-www

    ServerAdmin admin@trafalgararches.co.uk
    ServerName trafalgararches.co.uk
    ServerAlias www.trafalgararches.co.uk

    <Directory /home/tom/tata-www/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride All
            Order allow,deny
            allow from all
    </Directory>

    logLevel error
    ErrorLog /var/log/apache2/error.log
</VirtualHost>

Но каждый раз, когда я запрашиваю страницу на trafalgararches.co.uk, мне дают страницу на radiofreebrighton.org.uk. Почему это может происходить? Как я могу это исправить?


Редактировать:

Конфигурация виртуального хоста в понимании apache:

tom@rfb:/usr/local$ apache2ctl -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server radiofreebrighton.org.uk (/etc/apache2/sites-enabled/radiofreebrighton.org.uk:1)
         port 80 namevhost radiofreebrighton.org.uk (/etc/apache2/sites-enabled/radiofreebrighton.org.uk:1)
         port 80 namevhost trafalgararches.co.uk (/etc/apache2/sites-enabled/trafalgararches.co.uk:1)
Syntax OK

(Подобрано через apache2ctl -Sака httpd -S.)


1
Не уверен, что это причина, но вы должны удалить косые черты с концов ServerNameи ServerAliasлиний. Также убедитесь, что вы перезапустили Apache.
EEAA

Я почти уверен, что это причина. Это означает, что имя хоста в запросе никогда не будет совпадать с именем сервера для этого виртуального хоста.
Жаворонки

1
@ErikA, @larsks - Вы, ребята, оправдали мои надежды! Я удалил косые черты и перезапустил apache, но это ничего не изменило.
Том Райт

1
У вас есть NameVirtualHost *:80где-нибудь в вашей конфигурации?
Жаворонки

1
Я не уверен, являются ли упомянутые выше сайты производственными или разрабатываемыми, но на самом деле переход на эти URL дает две разные страницы для меня (правильные страницы по внешнему виду). Если вышеупомянутые vhosts находятся на сервере разработки, проигнорируйте этот комментарий. В противном случае, вы могли бы решить проблему где-то по пути и все еще иметь кешированную копию.
cyberx86

Ответы:


15

Ну, этому вопросу больше года, но я наткнулся на похожую «проблему». Это может быть очевидно, но не забудьте перезапустить службу apache после включения дополнительного виртуального хоста. Смотрите, после выполнения a2ensiteдля второго виртуального хоста, вывод apache2ctl -Sпокажет, что оба сайта доступны (и один из них по умолчанию), даже если вы не перезагрузили apache.

Допустим, у вас есть два виртуальных хоста - site1 и site2. Вы запускаете a2ensite site1и затем перезагружаете службу Apache. Теперь вы можете получить доступ, http://site1и это по умолчанию. Теперь вы бежите a2ensite site2, но забудьте перезапустить apache. Выход apache2ctl -Sбудет:

VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80                   is a NameVirtualHost
         default server site1 (/etc/apache2/sites-enabled/site1:1)
         port 80 namevhost site1 (/etc/apache2/sites-enabled/site1:1)
         port 80 namevhost site2 (/etc/apache2/sites-enabled/site2:1)
Syntax OK

Но когда вы попытаетесь загрузить http://site2, он фактически загрузит сайт по умолчанию (site1), так как конфигурация не загружена.


Я получаю тот же вывод, но даже тогда он не загружает второй сайт.
arqam

15

У меня была похожая проблема, когда все мои дополнительные vhosts на порту 443 (SSL / HTTPS) направлялись в каталог первого перечисленного vhost. Apache фактически игнорировал свойство servername и сопоставлял его только по ip: port.

Оказывается, мне не хватало команды NameVirtualHost *: 443, чтобы включить именованный виртуальный хостинг для порта 443.

'NameVirtualHost *: 443' просто нужно вызвать один раз, и он должен быть определен над вашими vhosts для порта 443. Я поместил свое определение в файл ports.config, чтобы оно выглядело так:

NameVirtualHost *:80
Listen 80

<IfModule mod_ssl.c>
    NameVirtualHost *:443
    Listen 443
</IfModule>

<IfModule mod_gnutls.c>
    NameVirtualHost *:443
    Listen 443
</IfModule>

Не забудьте перезапустить apache после любых изменений.


1
Для чего стоит ... в Apache 2.4.18, при NameVirtualHostзапуске выдает следующее сообщение:AH00548: NameVirtualHost has no effect and will be removed in the next release /etc/apache2/ports.conf
Lambart

4

Мои 2 цента: поскольку я должен придерживаться IP-адреса (я не хочу, чтобы сайт обслуживался во всех установленных сетях), случилось так, что после изменения локального частного IP-адреса сервера я забыл изменить его здесь:

NameVirtualHost 192.168.100.20:80 <VirtualHost 192.168.100.20:80>

Конечно, это не проблема Apache, чтобы сообщить вам, что IP не существует локально.


2

Том, пожалуйста, посмотрите здесь http://httpd.apache.org/docs/2.0/en/mod/core.html#namevirtualhost

Заметка

Обратите внимание, что «основной сервер» и любые серверы по умолчанию никогда не будут обслуживаться для запроса IP-адреса NameVirtualHost (если по какой-либо причине вы не укажете NameVirtualHost, но затем не определите виртуальные хосты для этого адреса).

Так что все будет в порядке, если вы измените значение по умолчанию на ip-адрес вашего сервера.


Я попробовал это, но это ничего не изменило. Я также хотел бы избежать привязки себя к определенному IP, поэтому я собираюсь изменить его обратно. Кроме того, я должен отметить, что по умолчанию работает vhost.
Том Райт

1

Я нахожу ответ отсюда: http://alexking.org/blog/2007/11/01/apache-2-only-serve-first-virtual-host

Поместите 2 servername в тот же тег 1 VirtualHost, как показано ниже:

<VirtualHost *:80>
ServerName beta-site-1.com
DocumentRoot "/Library/WebServer/beta-site-1"

ServerName beta-site-2.com
DocumentRoot "/Library/WebServer/beta-site-2"
</VirtualHost>

У меня возникли проблемы со вторым сайтом, потому что у меня было два блока тегов VirtualHost.


0

У меня была проблема с переносом сайтов на новый сервер Ubuntu 16. После некоторого головокружения я понял, что модуль SSL не был включен по умолчанию, поэтому все внутри <IfModule mod_ssl.c>блоков, конечно, молча игнорируется.

Несколько лет назад я обернул все свои SSL-vhosts в это условие, и на этот раз я только что скопировал файлы конфигурации на новый сервер.

Я исправил это, включив модуль:

sudo a2enmod ssl

0

Я обнаружил, что источником этой проблемы была запись в / etc / hosts на моем сервере с URL-адресом, указывающим на внешний IP-адрес сервера.

В какой-то момент я должен был настроить его до того, как DNS был готов, поэтому я ввел запись / etc / hosts на моем сервере, указывающую на его собственный внешний IP:

1.2.3.4 vhost.example.com

Затем я настроил ServerAlias ​​на существующий сайт для «vhost.example.com»

Но я ничего не мог сделать, чтобы остановить Apache, обслуживающий сайт default-ssl.conf для запросов SSL на vhost.example.com. HTTP-порт 80 работал нормально, но вместо этого в SSL всегда отображался сайт по умолчанию. В конце концов, этот поток SO побудил меня попробовать "apachectl -S", который показывает сайты, и, наконец, я смог понять это.

Поэтому, если вы получаете SSL-сайт по умолчанию вместо ожидаемого, убедитесь, что вы не добавили внешний IP-адрес вашего сервера в запись / etc / hosts! Оглядываясь назад, довольно странно, но, надеюсь, это поможет кому-то еще!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.