Bonjour à vous,
merci pour vos retours !
Bon j'ai relu en détail la doc d'Ubuntu et aussi celle d'Apache et voici les conclusions auxquelles je suis arrivé.
Ce que je cherche à faire s'appelle de l'hébergement de serveurs virtuels par nom.
Le prototype *minimal* de base est le suivant :
<VirtualHost *:80>
ServerName toto.fr
DocumentRoot /var/www/toto/
</VirtualHost>
Quand, au lancement du serveur, Apache rencontre ce bloc il interprète cela de la manière suivante :
VirtualHost *:80 -> Ok, tout ce qui arrive sur le port 80 toutes interfaces confondues, devra être interprété comme un serveur virtuel
ServerName : comment est-ce que le client est arrivé à me joindre ? Je regarde le champ "Host:" de l'entête http et s'il contient "toto.fr" alors j'applique les directives du bloc.
DocumentRoot : en l'occurence le site toto.fr sera servi par le répertoire /var/www/toto/
On peut ensuite raffiner et rajouter d'autres ServerName grâce à ServerAlias (par exemple toto.org...)
Les deux mécanismes que je ne maîtrisais pas sont les suivants :
- les blocs VirtualHost ont une priorité ! Si plusieurs blocs matchent alors seul le premier d'entre eux sera pris en compte
- et surtout, si aucun bloc ne matche alors le premier VirtualHost sera pris en compte !!
Pour reprendre les trois points que je ne comprenais pas, j'ajouterai donc ces commentaires :
1) l'adresse "blog2.local" affiche étrangement "blog1"
C'est attendu.
Le premier vhost ne marche pas (on attend comme ServerName blog1.local mais l'entête contient blog2.local)
Le second vhost n'est carrément pas pris en compte car il ne traite que des requêtes parvenant sur le port 443.
Comme aucun vhost ne fonctionne, c'est le premier vhost qui sera appliqué en l'occurence blog1.local. Voici pourquoi l'adresse "blog2.local" pointera vers le blog1.
Si ce comportement n'est pas celui attendu, il aurait fallu (je pense) ajouter une règle explicite pour prendre en compte l'adresse blog2.local. Quelque chose comme :
<VirtualHost *:80>
ServerName blog2.local
ServerAlias www.blog2.local
DocumentRoot /path/to/htdocs_blog2
<Directory /path/to/htdocs_blog2>
Require all granted
</Directory>
</VirtualHost>
2) www.blog1.local et www.blog2.local ne fonctionnent pas
Réponse trouvée par krodelabestiole. Effectivement il fallait rajouter les adresses en www dans /etc/hosts.
Au passage, je ne connaissais pas systemd.resolved, je vais regarder ça ! Ca me paraît effectivement plus "propre" que ma solution.
3) si je tape "blog2.local:443", je tombe sur une magnifique erreur <Bad Request>...
Je pense que mon interprétation est la bonne (voir message initial). Pour contourner ce problème, une solution serait de
forcer le passage en https.
Voici les citations pertinentes de la documentation Apache qui appuient mon propos.
https://httpd.apache.org/docs/2.2/fr/vhosts/details.html a écritLe premier serveur virtuel de cette liste (donc, le premier serveur virtuel du fichier de configuration attribué à l'adresse IP spécifiée) se voit attribuer la plus grande priorité, ce qui signifie que c'est lui qui traite les requêtes présentant un nom de serveur invalide ou ne présentant pas de champ Host: dans l'en-tête.
Si un champ Host: est transmis dans l'en-tête de la requête, son occurrence est recherchée dans la liste et le premier serveur virtuel qui présente un ServerName ou un ServerAlias correspondant est choisi pour servir la requête. Il est possible que le champ Host: contienne un numéro de port, mais Apache utilise toujours le port sur lequel il a effectivement reçu la requête.
https://httpd.apache.org/docs/2.4/fr/mod/core.html#servername a écritLa directive ServerName permet (éventuellement en conjonction avec la directive ServerAlias) d'identifier de manière unique un serveur virtuel, lorsqu'elle est utilisée dans un contexte de serveurs virtuels à base de noms.
(...)
Si vous définissez des serveurs virtuels à base de nom, une directive ServerName située à l'intérieur d'une section <VirtualHost> spécifiera quel nom d'hôte doit apparaître dans l'en-tête de requête Host: pour pouvoir atteindre ce serveur virtuel.
Merci par avance de me corriger si vous pensez que j'interprète mal la doc 🙂
Bonne journée à tous !
Donut