Pourquoi nginx fait-il cela ?
La raison en est simple. Les clients très anciens ou défectueux ne transmettent pas le champ d'en-tête HTTP Host
dans leurs requêtes et si vous utilisez des blocs serveurs basés sur le nom (hôtes virtuels basés sur le nom en termes d'Apache), nginx n'est pas en mesure de déterminer le serveur que vous avez configuré pour le client. Le même problème est vrai pour tout autre serveur web qui prend en charge ce système basé sur le nom. Ce problème ne se poserait pas si vous utilisiez un système basé sur IP pour chaque domaine (ce qui signifie également que vous avez plusieurs interfaces réseau).
En savoir plus sur ce sujet ? Comment nginx traite une requête
Lequel est le premier ?
nginx sélectionnera le serveur qui apparaît en premier si aucun indicateur default
n'a été défini sur une directive listen
:
server {
server_name server1.com;
}
server {
server_name server2.com;
}
server1.com
sera par défaut.
Si vous incluez automatiquement les liens symboliques de sites-enabled
(configuration par défaut), le fichier qui apparaît en premier dans le répertoire sera votre premier serveur.
Que puis-je faire pour éviter cela ?
Bonne question et vous devriez l'éviter. Il n'y a aucune raison de prendre en charge ces anciens clients et absolument aucune raison de prendre en charge les clients défectueux. Le problème est facilement résolu en créant une configuration de serveur par défaut. L'exemple suivant provient de l'un de mes projets et est destiné à la version de développement actuelle de nginx (1.5.2 - mais devrait fonctionner également avec les versions plus anciennes) :
# /etc/nginx/sites-enabled/_.conf
# Serveur par défaut pour les clients qui ne transmettent pas correctement l'en-tête Host.
# Le souligné dans le nom du fichier fait en sorte que ce fichier apparaisse en premier dans le répertoire.
server {
server_name _;
listen *:80 default_server deferred;
return 444;
}
La configuration est réduite, plus de trucs de configuration nginx.