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

Apache - прослушивать только определенный домен, а не IP

Как я могу настроить 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>