Как отключить 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.