différence entre _default _: * et *: * dans le contexte VirtualHost

35

Je veux connaître la différence entre " default : *" et "*: *" dans le contexte VirtualHost.

<VirtualHost _default_:*>
  #...
  ServerName host.example.com
  #...
</VirtualHost>

<VirtualHost *:*>
  #...
  ServerName host.example.com
  #...
</VirtualHost>

Je ne connais pas la différence et le port d’utilisation.

Thk

Luigi Giuseppe
la source

Réponses:

40

La solution est sur la documentation Apache 2.2 sur la directive Virtualhost :

Syntaxe: ... (...) Addr peut être:

  • L'adresse IP de l'hôte virtuel;
  • Un nom de domaine complet pour l'adresse IP de l'hôte virtuel (non recommandé);
  • Le caractère * , utilisé uniquement en association avec NameVirtualHost * pour correspondre à toutes les adresses IP; ou
  • La chaîne _default_ , utilisée uniquement avec l'hébergement virtuel IP pour intercepter des adresses IP sans correspondance.

Il existe deux manières de gérer Virtualhosts: virtualhosting basé sur nom et virtualhosting basé sur IP.

Avec les hôtes virtuels nommés, vous avez une liste d’hôtes virtuels, chacun gérant un ou plusieurs noms de domaine, et chacun associé à un couple listening IP:port. *est une valeur spéciale qui désigne toutes les adresses IP de cet hôte . Le virtualHost par défaut est le premier déclaré sur cette liste pour chaque adresse d'écoute donnée.

Avec les VirtualHosts basés sur IP, la ServerNamedirective du VirtualHost n’est pas utilisée, les informations importantes sont l’IP (et le port) à l’écoute, et le VirtualHost par défaut est le premier correspondant à l’IP qui gère la requête entrante.

Donc, avec une configuration nommée virtualhosting:

  • <Virtualhost *:80> with ServerName foo.com signifie "sur toutes les adresses IP gérées sur cet hôte", "sur le port 80", "si l'en-tête de l'hôte de la demande est foo.com", je vais utiliser cet hôte virtuel
  • <Virtualhost *:*> with Servername foo.com signifie "sur toutes les adresses IP gérées sur cet hôte", "sur tous les ports", "si l'en-tête de l'hôte de la demande est foo.com", je vais utiliser cet hôte virtuel
  • <Virtualhost 10.0.0.2:*> with Servername foo.com signifie "pour les requêtes entrantes de mon interface réseau 10.0.0.2", "sur tous les ports", "si l'en-tête de l'hôte de la requête est foo.com", je vais utiliser cet hôte virtuel
  • <Virtualhost _default_:*> with Servername foo.com : ne doit pas être utilisé avec virtualhosting basé sur le nom

Et sur un hébergement virtuel basé sur IP:

  • <Virtualhost 10.0.0.2:*> signifie "je vais utiliser cet hôte virtuel pour les requêtes venant de mon interface 10.0.0.2"
  • <Virtualhost _default_:443> signifie "je vais utiliser cet hôte virtuel pour toutes les autres interfaces réseau de mon hôte pour les requêtes arrivant sur le port 443"
  • <Virtualhost _default_:*> signifie "j'utiliserai cet hôte virtuel pour toutes les autres interfaces réseau de mon hôte, s'il ne correspond à aucune règle précédente et si l'en-tête de l'hôte de la demande ne correspond pas à un hôte virtuel nommé"

Il s’agit donc de définir un Virtualhost polyvalent. La documentation ajoute:

Lorsque vous utilisez un hébergement virtuel basé sur IP, vous _default_pouvez spécifier le nom spécial. Dans ce cas, cet hôte virtuel correspond à toute adresse IP non explicitement répertoriée sur un autre hôte virtuel. En l'absence de tout _default_hôte virtuel, la configuration du serveur "principal", composée de toutes ces définitions en dehors de toute section VirtualHost, est utilisée lorsqu'aucune correspondance IP ne se produit. (Notez cependant que toute adresse IP correspondant à une directive NameVirtualHost n'utilisera ni la configuration du serveur "principal" ni l' _default_hôte virtuel. Pour plus d'informations, reportez-vous à la documentation sur l'hébergement virtuel basée sur le nom.)

Donc, après toutes ces choses, il devient assez "clair" que le mélange de virtualhosting basé sur IP et sur nom pourrait devenir un gâchis. Avec Apache 2.2, virtualhosting basé sur le nom n'était utilisé que s'il NameVirtualhost <something>était utilisé.

Mais avec la nouvelle version d' Apache 2.4 , ces choses sont vraiment plus faciles à comprendre, pas de NameVirtualhostdéclaration. La directive NameVirtualHost n'a plus d'effet, sinon d'émettre un avertissement. Toute combinaison adresse / port apparaissant dans plusieurs hôtes virtuels est implicitement traitée comme un hôte virtuel basé sur un nom . Plus de problèmes complexes, même la documentation est maintenant plus simple:

  • Le caractère *, qui agit comme un caractère générique et correspond à n'importe quelle adresse IP.
  • La chaîne _default_, qui est un alias pour *

Donc, avec apache 2.4, la réponse est la même chose .

Regilero
la source