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

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

Я пытаюсь добавить второй виртуальный хост в свою конфигурацию 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:

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

<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.)

Это может быть очевидно, но не забудьте перезапустить службу 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), поскольку конфигурация не загружена.

У меня была аналогичная проблема, когда все мои дополнительные хосты на порту 443 (SSL / HTTPS) были направлены в каталог первого указанного хоста. 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 после любых изменений.

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

NameVirtualHost 192.168.100.20:80 <VirtualHost 192.168.100.20:80>

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

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

Заметка

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

Так что ничего страшного, если вы измените дефолт на ip-адрес вашего сервера.

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

Поместите 2 имени сервера в один и тот же тег 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.

Я обнаружил, что источником этой проблемы была запись в / 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. Порт 80 HTTP работал нормально, но SSL всегда показывал сайт по умолчанию. В конце концов, этот тред заставил меня попробовать "apachectl -S", который показывает сайты, и, наконец, я смог это понять.

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

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

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

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

sudo a2enmod ssl