Как отключить виртуальный хост по умолчанию в apache2?

Вопрос или проблема

В apache2 по умолчанию любой http-запрос с неизвестным хостом будет направлен на первый загруженный VirtualHost. Есть ли способ отключить эту функцию? Иначе говоря, я хочу иметь веб-сервер, на котором пользователь может получать доступ только к явно названным определениям VirtualHost. Любое другое имя хоста, не упомянутое явно в строках ServerName или ServerAlias, должно быть тихо игнорировано.

Это возможно?

Listen 80
NameVirtualHost *

<VirtualHost _default_:*>
# Все, что соответствует этому хосту, должно быть тихо игнорировано.
</VirtualHost>

<VirtualHost *>
DocumentRoot /www/example1
ServerName www.example.com
</VirtualHost>

<VirtualHost *>
DocumentRoot /www/example2
ServerName www.example.org
</VirtualHost>

Обновление: Как было предложено ниже и в других местах, тихое игнорирование запроса может быть не лучшей идеей и, возможно, нарушает RFC для HTTP. Однако, поскольку виртуальные хосты предназначены для симуляции нескольких отдельных физических HTTP-серверов, подход тихого игнорирования не кажется мне неразумным. Это было бы то же самое, что и виртуальный хостинг на основе IP и блокирование некоторых IP (возможно, не для всех клиентов).

Я не уверен, что “тихое падение” — хорошая идея. Вы должны дать клиенту хотя бы некоторое указание на то, что произошло. Возможно, вы могли бы отправить http 410 “gone” ошибку. Что-то вроде этого должно сработать:

RewriteRule ^.*$ - [G]

Кроме того, вы должны иметь возможность указать пользовательский документ ошибки 410, которым может быть просто пустая HTML-страница.

Вот альтернативный способ, который не включает правила переписывания:

<VirtualHost _default_:*>
    <Location />
        Deny from all
        Options None
        ErrorDocument 403 Forbidden.
    </Location>
</VirtualHost>

это сработало для меня

<VirtualHost x.x.x.x:80 [x:x::x:x:x:x]:80>
  ServerName myactualservername.com
  ServerAlias *
  <Location />
    Deny from all
    Options None
    ErrorDocument 403 Forbidden.
  </Location>
</VirtualHost>

замените x.x.x.x на ваш фактический ipv4 и ipv6
замените myactualservername.com на фактический сайт, обслуживаемый машиной

я использую виртуальный хостинг на основе имени.
благодарность за это решение
https://serverfault.com/a/82309/459796

Я попробовал все другие ответы, перечисленные здесь, и они не были эффективны в предотвращении запросов по IP.

Вместо этого я решил по умолчанию запрещать все (Require all denied и ничего больше как ваша модель безопасности по умолчанию) и явно включать в белый список домены.

<VirtualHost my.domain.com:443>

Я хостирую несколько виртуальных сайтов, и как вы сказали, я также не хочу никаких ответов по IP-адресам, на которых у меня нет фактического сайта. Я изменил свой файл /etc/apache2/ports.conf, закомментировав существующие строки Listen на портах 80 и 443, и теперь слушаю ТОЛЬКО на желаемых IP и портах. (В качестве предосторожности я закомментировал то, что было до моего изменения, чтобы я мог легко вернуть обратно, если возникнет проблема с этим)

#закомментировал Listen 80, не связанный с конкретным IP
#Listen 80

# Повторил Listen для портов 80 и 443 для каждого сайта, который я хостирую.
Listen xxx.xxx.xxx.xxx:80
Listen xxx.xxx.xxx.xxx:443

#закомментировал Listen 443, не связанный с конкретным IP
#<IfModule ssl_module>
#    Listen 443
#</IfModule>

#<IfModule mod_gnutls.c>
#    Listen 443
#</IfModule>

Ответ или решение

Чтобы отключить поведение по умолчанию виртуального хоста в Apache2, когда запросы с неизвестным заголовком Host перенаправляются к первому загруженному виртуальному хосту, вы можете использовать несколько подходов. Ниже представлены методы, которые помогут вам настроить сервер таким образом, чтобы он обрабатывал только явно заданные виртуальные хосты и игнорировал остальные.

Метод 1: Использование виртуального хоста по умолчанию

Самый простой способ — создать виртуальный хост по умолчанию, который будет отклонять все ненужные запросы. Вот пример конфигурации:

<VirtualHost _default_:*>
    <Location />
        Require all denied
        ErrorDocument 403 "Доступ запрещён."
    </Location>
</VirtualHost>

Этот виртуальный хост будет принимать все запросы, которые не соответствуют другим явно заданным виртуальным хостам, и возвращать ошибку 403 (с доступом запрещён), когда запрос не соответствует ни одному из определённых имён.

Метод 2: Отключение по умолчанию с использованием Rewrite

Вы также можете использовать правила перенаправления для возврата кода состояния HTTP 410 (устаревший). Например:

<VirtualHost _default_:*>
    RewriteEngine On
    RewriteRule ^.*$ - [G]
</VirtualHost>

Это правило означает, что любые запросы не соответствующие ни одному из существующих виртуальных хостов будут возвращать статус 410 "Gone".

Метод 3: Настройка IPv4 и IPv6

Поскольку вы хотите полностью игнорировать запросы, которые не соответствуют явно заданным виртуальным хостам, убедитесь, что ваш сервер слушает только на конкретных IP-адресах. Для этого откройте файл /etc/apache2/ports.conf и укажите необходимые IP-адреса:

# Удалите или закомментируйте строки с Listen
# Listen 80
# Listen 443

# Добавьте конкретные IP-адреса
Listen xxx.xxx.xxx.xxx:80
Listen xxx.xxx.xxx.xxx:443

Замените xxx.xxx.xxx.xxx на ваши реальные IP-адреса. Это гарантирует, что только запросы, идущие на эти IP и соответствующие заданным виртуальным хостам, будут обрабатываться.

Метод 4: Ограничение доступа по доменам

Вы можете также побороть нежелательные запросы, ограничив доступ к серверу по доменам. Например:

<VirtualHost my.domain.com:80>
    ServerName my.domain.com
    DocumentRoot /var/www/mydomain
</VirtualHost>

<VirtualHost *:80>
    ServerName other.domain.com
    DocumentRoot /var/www/otherdomain
</VirtualHost>

<VirtualHost *:80>
    ServerName default.domain.com
    <Location />
        Require all denied
    </Location>
</VirtualHost>

Заключение

Каждый из предложенных методов позволит вам достичь цели запрета на обработку запросов, которые не соответствуют явно определённым виртуальным хостам. Однако выбор подхода зависит от ваших конкретных целей и требований к конфиденциальности и безопасности вашего веб-сервера.

Оцените материал
Добавить комментарий

Капча загружается...