Как отключить VirtualHost по умолчанию в apache2?


10

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

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

Listen 80
NameVirtualHost *

<VirtualHost _default_:*>
# Anything matching this host should be silently ignored.
</VirtualHost>

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

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

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

Ответы:


4

Я не уверен, что "молчаливая неудача" - хорошая идея. Вы должны дать клиенту хоть какое-то указание на то, что произошло. Возможно, вы могли бы отправить http 410 «ушел» ошибка. Нечто подобное должно сделать свое дело:

RewriteRule ^.*$ - [G]

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


Я также обнаружил это решение самостоятельно. Вы должны добавить строки для загрузки mod_rewrite и "RewriteEngine On", отметив, что они могут быть не нужны. Они были для меня. :)
— Харви

2
Кроме того, поскольку мы просто говорим «Унесенные» или «Запрещено» и, что более важно, «-» предотвращает замену, регулярное выражение может быть намного проще:RewriteRule . - [F]
— Харви,

17

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

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

2
Это должно быть принятым решением. +1
— Грег Шмит

Я не уверен в этом решении. У меня есть несколько файлов VHOST, и я просто делаю новый с этим в нем? Я попробовал это, и я назвал файл 001.default.conf, но у меня все еще происходит перенаправление моих поддоменов.
— Frantumn

@Frantumn Как отмечено в вопросе, «любой http-запрос с неизвестным хостом будет направлен на первый загруженный VirtualHost ». <VirtualHost>Поэтому это «значение по умолчанию» должно быть сначала определено в конфигурации сервера. Какой именно файл должен находиться в, зависит от вашей конфигурации. (Однако проблема «перенаправленных поддоменов» может быть не связана.)
— MrWhite,

Да. При использовании других доменов, которые указывают на мой сервер, он не выполняет 403, он просто выбирает первый виртуальный хост, который находит, хотя имя сервера не совпадает
— jjxtra

1

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

<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>

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.