Comment désactiver VirtualHost par défaut dans apache2?

10

Dans apache2 par conception, toute demande http avec un hôte inconnu sera dirigée vers le premier VirtualHost chargé. Existe-t-il un moyen de désactiver cette fonctionnalité? Autrement dit, je veux avoir un serveur Web où l'utilisateur ne peut accéder qu'aux définitions de VirtualHost explicitement nommées. Tout autre nom d'hôte non explicitement mentionné dans une ligne ServerName ou ServerAlias ​​doit être ignoré en silence.

Est-ce possible?

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>

Mise à jour: comme suggéré ci-dessous et ailleurs, ignorer silencieusement une demande peut ne pas être une bonne idée et peut-être casse les RFC pour HTTP. Cependant, étant donné que les hôtes virtuels sont conçus pour simuler plusieurs serveurs HTTP physiques distincts, l'approche silencieuse ne me semble pas déraisonnable. Ce serait la même chose que l'hébergement virtuel basé sur IP et le pare-feu sur certaines adresses IP (peut-être pas pour tous les clients).

Harvey
la source

Réponses:

4

Je ne suis pas sûr que "échouer silencieusement" soit une bonne idée. Vous devez donner au client au moins quelques indications sur ce qui s'est passé. Vous pourriez peut-être envoyer une erreur http 410 "disparu". Quelque chose comme ça devrait faire l'affaire:

RewriteRule ^.*$ - [G]

De plus, vous devriez pouvoir spécifier un document d'erreur 410 personnalisé, qui pourrait être simplement une page html vierge.

EEAA
la source
J'ai fini par découvrir cette solution par moi-même. Vous devez ajouter des lignes pour charger mod_rewrite et "RewriteEngine On" en notant qu'elles peuvent ne pas être nécessaires. Ils étaient pour moi. :)
Harvey
2
De plus, comme nous disons simplement Gone or Forbidden et plus important encore, le "-" empêche la substitution, l'expression régulière peut être beaucoup plus simple:RewriteRule . - [F]
Harvey
17

Voici une autre méthode qui n'implique pas de règles de réécriture:

<VirtualHost _default_:*>
    <Location />
        Deny from all
        Options None
        ErrorDocument 403 Forbidden.
    </Location>
</VirtualHost>
forgeron
la source
2
Cela devrait être la solution acceptée. +1
Greg Schmit
Je ne suis pas clair sur cette solution. J'ai plusieurs fichiers VHOST et dois-je en créer un nouveau avec ça? J'ai essayé cela et j'ai nommé le fichier 001.default.conf mais j'ai encore une redirection de mes sous-domaines en cours.
Frantumn
@Frantumn Comme indiqué dans la question, "toute demande http avec un hôte inconnu sera dirigée vers le premier VirtualHost chargé ". Ce "défaut" <VirtualHost>doit donc être défini en premier dans la configuration du serveur. Le fichier qui doit se trouver dépend précisément de votre configuration. (Cependant, votre problème de "sous-domaines redirigés" pourrait être un problème sans rapport.)
MrWhite
Huh. Lorsque vous utilisez d'autres domaines qui pointent vers mon serveur, il ne fait pas le 403, il sélectionne simplement le premier hôte virtuel qu'il trouve, même si le nom de serveur n'est pas une correspondance
jjxtra
1

cela a fonctionné pour moi

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

remplacez xxxx par votre ipv4 et ipv6
réels remplacez myactualservername.com par un site Web réel desservi par la machine

j'utilise l'hôte virtuel basé sur le nom.
le crédit pour cette solution va à
https://serverfault.com/a/82309/459796

Yashesh Bhatia
la source