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

Виртуальный хост Apache по умолчанию загружен не в правильном порядке

Apache / 2.4.6 (CentOS)

Некоторое время у меня была настроена общая страница для моего сервера Apache, поэтому боты не будут сканировать мой основной сайт, если у них нет моего доменного имени.

Однако недавно я заметил, что это больше не работает с моей конфигурацией. При загрузке страницы по IP-адресу (скажем, 10.20.20.10) я получаю основной сайт (скажем, mysite.net) вместо общего доступа.

Конфигурация выглядит так:

<VirtualHost _default_:80>
        ServerName default
        # More config ...
</VirtualHost>

<VirtualHost _default_:443>
        ServerName default
        # More config ...
</VirtualHost>

<VirtualHost 10.20.20.10:80>
        ServerName mysite.net
        # More config ...
</VirtualHost>

<VirtualHost 10.20.20.10:443>
        ServerName mysite.net
        # More config ...
</VirtualHost>

Бег apachectl -S показал мне, что он не загружается по умолчанию:

10.20.20.10:443       is a NameVirtualHost
     default server mysite.net (/etc/httpd/sites-enabled/01-mysite.conf:24)
     port 443 namevhost mysite.net (/etc/httpd/sites-enabled/01-mysite.conf:24)
*:80                   localhost (/etc/httpd/sites-enabled/00-catchall.conf:2)
*:443                  localhost (/etc/httpd/sites-enabled/00-catchall.conf:16)

Мне удалось найти способ по умолчанию загружать мой сборщик, но для этого требовалось, чтобы я изменил свой сборщик на тот же IP-адрес прослушивания, что и мой основной виртуальный хост. Не самое идеальное решение. Я бы предположил, что изменение всех vhosts на * также сделает это, но это тоже не идеально.

На основании наблюдений выяснилось, что httpd предпочитает более близкое соответствие и принимает соответствие IP вместо "*". Может ли кто-нибудь пролить свет на то, почему Apache не загружает первый виртуальный хост и что может это исправить?

Мне просто интересно, разве это не имеет смысла, поскольку mysite.net это первый vhost для VirtualHost 10.20.20.10:80 что он станет сайтом по умолчанию?

Я не имею понятия почему _default_ не работает на вас. Но, возможно, вместо этого сработает что-то подобное. Это то, что вы уже пробовали? Что в этом не идеального?

<VirtualHost 10.20.20.10:80>
        ServerName default
        # More config ...
</VirtualHost>

<VirtualHost 10.20.20.10:443>
        ServerName default
        # More config ...
</VirtualHost>

<VirtualHost 10.20.20.10:80>
        ServerName mysite.net
        # More config ...
</VirtualHost>

<VirtualHost 10.20.20.10:443>
        ServerName mysite.net
        # More config ...
</VirtualHost>

Этот вопрос / ответ объяснил бы вашу проблему, если бы вы использовали Apache 2.2. Но это не так. Честно говоря, это не то, с чем я слишком хорошо знаком. Очевидно, вы не должны использовать _default_ с виртуальным хостингом на основе имени, скорее *:* или *:port.

разница между _default _: * и *: * в контексте VirtualHost

So with a named based virtualhosting configuration:

<Virtualhost *:80> with ServerName foo.com means "on all IPs managed on this host", "on port 80", "if the request host header is foo.com" I'll use this virtualhost
<Virtualhost *:*> with Servername foo.com means "on all IPs managed on this host", "on all ports", "if the request host header is foo.com" I'll use this virtualhost
<Virtualhost 10.0.0.2:*> with Servername foo.com means "for request incoming from my network interface 10.0.0.2", "on all ports", "if the request host header is foo.com" I'll use this virtualhost
<Virtualhost _default_:*> with Servername foo.com : should not be used with name based virtualhosting
And on an IP based Virtualhosting:

<Virtualhost 10.0.0.2:*> means "I'll use this virtualhost for request coming on my 10.0.0.2 interface"
<Virtualhost _default_:443> means "I'll use this virtualhost for all other network interface on my host for request coming on port 443"
<Virtualhost _default_:*> means "I'll use this virtualhost for all other network interface on my host, if it is not matched by a previous rule, and if the request host header is not matched by a named based virtualhost"

Ubuntu такой же, как и вы Я попытался назначить IP-адрес одному из vhosts (example2.com), а не <VirtualHost *:80> и теперь он переопределяет vhost по умолчанию. Кажется, именно так работает Apache. A * не может переопределить IP-адрес. curl 192.168.1.143 теперь дает мне example2.com вместо общей страницы.

$ sudo apachectl -S
VirtualHost configuration:
192.168.1.143:80       example2.com (/etc/apache2/sites-enabled/example2.com.conf:1)
*:80                   is a NameVirtualHost
         default server www1.swass (/etc/apache2/sites-enabled/000-default.conf:1)
         port 80 namevhost www1.swass (/etc/apache2/sites-enabled/000-default.conf:1)
         port 80 namevhost example.com (/etc/apache2/sites-enabled/example.com.conf:1)
                 wild alias *.example.com

Удачи