Jak wyłączyć domyślny VirtualHost w apache2?

10

W apache2 z założenia każde żądanie HTTP z nieznanym hostem zostanie przekierowane do pierwszego załadowanego VirtualHost. Czy istnieje sposób na wyłączenie tej funkcji? Innymi słowy, chcę mieć serwer WWW, na którym użytkownik może uzyskać dostęp tylko do jawnie nazwanych definicji VirtualHost. Każda inna nazwa hosta niewymieniona wprost w wierszu ServerName lub ServerAlias ​​powinna zostać po cichu zignorowana.

czy to możliwe?

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>

Aktualizacja: Jak sugerowano poniżej i gdzie indziej, ciche ignorowanie żądania może nie być dobrym pomysłem i może zepsuć RFC dla HTTP. Ponieważ jednak wirtualne hosty są zaprojektowane do symulacji z wieloma oddzielnymi fizycznymi serwerami HTTP, metoda cichego ignorowania nie wydaje mi się nieracjonalna. Byłoby to tak samo, jak wirtualny hosting oparty na protokole IP i zapora ogniowa niektórych adresów IP (być może nie dla wszystkich klientów).

Harvey
źródło

Odpowiedzi:

4

Nie jestem pewien, czy „cicha porażka” to dobry pomysł. Powinieneś dać klientowi przynajmniej pewne wskazówki, co się stało. Być może możesz wysłać błąd http 410 „zniknął”. Coś takiego powinno załatwić sprawę:

RewriteRule ^.*$ - [G]

Ponadto powinieneś być w stanie określić niestandardowy dokument błędu 410, który może być po prostu pustą stroną HTML.

EEAA
źródło
Skończyłem też odkrywać to rozwiązanie na własną rękę. Powinieneś dodać linie do ładowania mod_rewrite i „RewriteEngine On”, zauważając, że mogą one nie być konieczne. Były dla mnie. :)
Harvey
2
Ponadto, ponieważ jesteśmy po prostu mówiąc Przeminęło lub zakazane, a co ważniejsze, „-” wyklucza zamianę, regex może być znacznie prostsza:RewriteRule . - [F]
Harvey
17

Oto alternatywny sposób, który nie wymaga przepisywania reguł:

<VirtualHost _default_:*>
    <Location />
        Deny from all
        Options None
        ErrorDocument 403 Forbidden.
    </Location>
</VirtualHost>
atomista
źródło
2
To powinno być przyjęte rozwiązanie. +1
Greg Schmit
Nie mam jasności co do tego rozwiązania. Mam kilka plików VHOST i czy po prostu utworzę nowy z tym? Próbowałem tego i nazwałem plik 001.default.conf, ale nadal mam do czynienia z przekierowywaniem moich poddomen.
Frantumn
@Frantumn Jak wspomniano w pytaniu, „każde żądanie HTTP z nieznanym hostem zostanie przekierowane do pierwszego załadowanego VirtualHost ”. To „domyślne” <VirtualHost>musi zatem zostać zdefiniowane najpierw w konfiguracji serwera. Dokładnie, który plik musi się znaleźć, zależy od konfiguracji. (Jednak problem z „przekierowanymi subdomenami” może być problemem niepowiązanym.)
MrWhite
Huh Podczas korzystania z innych domen, które wskazują mój serwer, nie robi 403, po prostu wybiera pierwszego znalezionego wirtualnego hosta, nawet jeśli nazwa
serwera
1

to zadziałało dla mnie

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

zamień xxxx na rzeczywisty ipv4 i ipv6
zastąp myactualservername.com rzeczywistą witryną obsługiwaną przez maszynę

Używam wirtualnego hosta opartego na nazwie.
kredyt za to rozwiązanie trafia na
https://serverfault.com/a/82309/459796

Yashsz Bhatia
źródło