Виртуальный хост по умолчанию не перехватывает запрос
У меня есть сервер 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>