Виртуальный хост по умолчанию не перехватывает запрос

У меня есть сервер Apache 2.4 с двумя включенными виртуальными хостами:

/etc/apache2/sites-enabled/000-default.conf

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

/etc/apache2/sites-enabled/my-website.conf

<VirtualHost my-website.com:80>
    ServerAdmin myself@my-website.com
    ServerName my-website.com
    Redirect permanent "/" "https://my-website.com/"
</VirtualHost>

<IfModule mod_ssl.c>
    <VirtualHost my-website.com:443>
    ....
    </VirtualHost>
</IfModule>

Я создал доменное имя, указывающее на тот же компьютер: my-other-website.com.

Когда я отправляю запрос http (browser, curl,...) на my-other-website.com, я ожидаю, что он будет обслуживать виртуальный хост по умолчанию. Вместо этого я получаю 301, перенаправленный на https://my-website.com/,

Как так?

изменения <VirtualHost *:80> в <VirtualHost _default_:80> не помогло

2 ответа

Решение

Марш VirtualHost немного своеобразен и специфичен.

"Проблема" в том, что вы смешиваете *:80 с hostname:80 и последнее является предпочтительным соответствием, когда получен запрос на эту комбинацию IP-адреса и номера порта.

И *:80 - это только VirtualHost по умолчанию для запросов, которые не имеют тот же IP-адрес, что и ваш домен my-website.com.

См. https://httpd.apache.org/docs/2.4/vhosts/details.html.

Когда соединение впервые получено по какому-либо адресу и порту, сервер ищет все определения VirtualHost с одинаковыми IP-адресом и портом.

Если нет точных совпадений для адреса и порта, то учитываются совпадения с подстановочными знаками (*).

Если совпадений не найдено, запрос обслуживается главным сервером.

Если для IP-адреса существуют определения VirtualHost, то следующим шагом должно стать решение о том, имеем ли мы дело с виртуальным хостом на основе IP или имени.

Сделать оба виртуальных хоста как

<VirtualHost *:80>

Однако я бы использовал IP для обоих хостов, это может быть тот же IP <VirtualHost xx.xx.xx.xx:80>

Другие вопросы по тегам