Wie deaktiviere ich den Standard-VirtualHost in Apache2?


10

In Apache2 wird jede http-Anforderung mit einem unbekannten Host per Design an den ersten geladenen VirtualHost weitergeleitet. Gibt es eine Möglichkeit, diese Funktion zu deaktivieren? Anders gesagt, ich möchte einen Webserver haben, auf dem der Benutzer möglicherweise nur explizit benannte VirtualHost-Definitionen erhält. Jeder andere Hostname, der nicht explizit in einer ServerName- oder ServerAlias-Zeile erwähnt wird, sollte stillschweigend ignoriert werden.

Ist das möglich?

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>

Update: Wie unten und anderswo vorgeschlagen, ist es möglicherweise keine gute Idee, eine Anfrage stillschweigend zu ignorieren, und möglicherweise werden die RFCs für HTTP beschädigt. Da virtuelle Hosts so konzipiert sind, dass sie mehrere separate physische HTTP-Server simulieren, erscheint mir der Ansatz des stillen Ignorierens nicht unangemessen. Dies entspricht dem IP-basierten virtuellen Hosting und dem Firewalling einiger IPs (möglicherweise nicht für alle Clients).

Antworten:


4

Ich bin mir nicht sicher, ob "stillschweigend scheitern" eine gute Idee ist. Sie sollten dem Kunden zumindest einen Hinweis darauf geben, was passiert ist. Vielleicht könnten Sie einen http 410 "weg" -Fehler senden. So etwas sollte den Trick machen:

RewriteRule ^.*$ - [G]

Darüber hinaus sollten Sie in der Lage sein, ein benutzerdefiniertes 410-Fehlerdokument anzugeben, bei dem es sich möglicherweise nur um eine leere HTML-Seite handelt.


Am Ende habe ich diese Lösung auch selbst entdeckt. Sie sollten Zeilen zum Laden von mod_rewrite und "RewriteEngine On" hinzufügen und beachten, dass diese möglicherweise nicht erforderlich sind. Sie waren für mich. :)
Harvey

2
Da wir nur "Gone" oder "Forbidden" sagen und, was noch wichtiger ist, das "-" eine Substitution verhindert, kann der Regex viel einfacher sein:RewriteRule . - [F]
Harvey

17

Hier ist eine alternative Methode, bei der keine Umschreiberegeln erforderlich sind:

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

2
Dies sollte die akzeptierte Lösung sein. +1
Greg Schmit

Mir ist diese Lösung nicht klar. Ich habe mehrere VHOST-Dateien und erstelle ich eine neue damit? Ich habe das versucht und die Datei 001.default.conf benannt, aber ich habe immer noch eine Umleitung meiner Subdomains.
Frantumn

@Frantumn Wie in der Frage angegeben, wird "jede http-Anfrage mit einem unbekannten Host an den ersten geladenen VirtualHost weitergeleitet ". Dieser "Standard" <VirtualHost>muss daher zuerst in der Serverkonfiguration definiert werden. Welche Datei sich genau befinden muss, hängt von Ihrer Konfiguration ab. (Ihr Problem mit "umgeleiteten Subdomains" könnte jedoch ein nicht verwandtes Problem sein.)
MrWhite

Huh. Wenn Sie andere Domänen verwenden, die auf meinen Server verweisen, wird der 403 nicht ausgeführt, sondern nur der erste gefundene virtuelle Host ausgewählt, obwohl der Servername nicht übereinstimmt
jjxtra

1

das hat bei mir funktioniert

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

Ersetzen Sie xxxx durch Ihr aktuelles ipv4 und ipv6.
Ersetzen Sie myactualservername.com durch eine tatsächliche Website, die vom Computer bereitgestellt wird

Ich verwende einen namenbasierten virtuellen Host.
Die Gutschrift für diese Lösung geht an
/server//a/82309/459796

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.