Apache использует поле Host
из заголовков HTTP-запросов, чтобы узнать, какой vhost запрашивается (Host
соответствует apache ServerName
или ServerAlias
).
Попробуйте apache2ctl -S
, это даст вам вывод, содержащий что-то вроде:
VirtualHost configuration:
*:80 is a NameVirtualHost
default server ip (/etc/apache2/sites-enabled/000-default.conf:1)
port 80 namevhost ip (/etc/apache2/sites-enabled/000-default.conf:1)
port 80 namevhost www.example1.com (/etc/apache2/sites-enabled/001-vhost.conf:1)
port 80 namevhost www.example2.com (/etc/apache2/sites-enabled/002-vhost.conf:1)
*:443 is a NameVirtualHost
default server 127.0.1.1 (/etc/apache2/sites-enabled/default-ssl.conf:2)
port 443 namevhost 127.0.1.1 (/etc/apache2/sites-enabled/default-ssl.conf:2)
port 443 namevhost www.example1.com (/etc/apache2/sites-enabled/non-default-ssl.conf:2)
Теперь представьте, что мой ip 1.1.1.1:
Учитывая эти три curl
команды:
1. curl http://1.1.1.1 -H 'Host: www.example1.com'
1. curl http://1.1.1.1 -H 'Host: www.example2.com'
1. curl http://1.1.1.1 -H 'Host: www.spoofexample.com'
Во-первых, apache находит соответствующий ServerName
в файле vhost и использует /etc/apache2/sites-enabled/001-vhost.conf для удовлетворения запроса
Второй, apache находит соответствующий ServerName
в файле vhost и использует /etc/apache2/sites-enabled/002-vhost.conf для удовлетворения запроса
Третий (ваш нежелательный сопоставленный DNS), apacheне находит соответствующий ServerName
ни в одном из своих файлов vhosts и использует /etc/apache2/sites-enabled/000-default.conf для удовлетворения запроса
Та же логика применима к SSL vhosts.
PS1: ServerName
для хоста HTTP по умолчанию имеет значение ip
, а в хосте SSL по умолчанию нет ServerName
.Apache просто принимает 127.0.1.1
, который не является IP-адресом, который он прослушивает (просто говорит, что это не более запутанно).
PS2: чтобы сделать vhost по умолчанию, он должен быть первым по отсортированным именам(000 -> 001 -> 002).