Как я могу настроить apache так, чтобы он отказывался от подключений, идущих напрямую на IP-адрес (http://xxx.xxx.xxx.xxx) вместо имени vhost http://example.com?
Моя конфигурация VirtualHost:
ServerName example.com
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/
<Directory /var/www/>
AllowOverride All
Order allow,deny
allow from all
</Directory>
</VirtualHost>
Вы не можете заставить его отклонять соединения, поскольку имя хоста (или IP-адрес), которое пользователь пытается использовать в качестве своего HTTP-хоста, не известно серверу, пока клиент не отправит HTTP-запрос. Слушатель TCP всегда привязан к IP-адресу.
Будет ли приемлем вместо этого ответ об ошибке HTTP?
<VirtualHost *:80>
ServerName catchall
<Location />
Order allow,deny
Deny from all
</Location>
</VirtualHost>
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/
<Directory /var/www/>
AllowOverride All
Order allow,deny
allow from all
</Directory>
</VirtualHost>
Вам нужно перейти на более низкий уровень, это только приходит мне в голову в цепочке брандмауэра, имеющей проверку валидации для REQUEST HOST и того, что у вас есть с Apache, это позволит игнорировать или отбрасывать пакет
Чистый способ справиться с этим - использовать RewriteRule следующим образом
<If "%{HTTP_HOST} == 'x.x.x.x'">
RewriteRule ^.*$ http://www.example.com/$1 [L]
</If>