Ninx Server_name Wildcard ou Catch-All
-
13-11-2019 - |
Question
J'ai une instance de Nginx en cours d'exécution qui sert plusieurs sites Web. Le premier est un message d'état sur l'adresse IP du serveur. Le second est une console d'administration sur admin.domain.com
. Ceux-ci fonctionnent très bien. Maintenant, j'aimerais toutes les autres demandes de domaine pour aller à un seul index.php
- J'ai beaucoup de domaines et de sous-domaines et il n'est pas pratique de les énumérer dans une configuration Nginx.
Jusqu'à présent, j'ai essayé de régler server_name
à *
Mais cela a échoué en tant que joker non valide. *.*
Fonctionne jusqu'à ce que j'ajoute les autres blocs de serveur, puis je suppose qu'il entre en conflit.
Existe-t-il un moyen d'exécuter un bloc de serveur Catch-All dans NGINX après que d'autres sites ont été définis?
NB Je ne suis pas un spammeur, ce sont des sites authentiques avec du contenu utile, ils sont juste alimentés par le même CMS à partir d'une base de données!
La solution
Modifiez l'option d'écoute dans votre bloc de serveur Catch-All. (Ajouter default_server
) Cela prendra toutes vos connexions non définies (sur le port spécifié).
listen 80 default_server;
Si vous souhaitez tout pousser sur index.php si le fichier ou le dossier n'existe pas;
try_files $uri /$uri /index.php;
Autres conseils
Un simple soulignement fonctionne également:
server_name _;
La source : http://nginx.org/en/docs/http/server_names.html
Cela fonctionnera:
server_name ~^(.+)$
Pour moi, définir en quelque sorte default_server ne fonctionnait pas. Je l'ai résolu par
server_name ~^.*$
en utilisant une expression régulière de tous.
Vous pouvez maintenant utiliser un masque:
server {
listen 80;
server_name *.example.org;
...
}
server {
listen 80;
server_name mail.*;
...
}
Regardez plus ici: http://nginx.org/en/docs/http/server_names.html
Seulement 1 server
directif
Le paramètre default_server, s'il est présent, fera que le serveur deviendra le serveur par défaut de l'adresse spécifiée: paire de ports. Si aucune des directives n'a le paramètre default_server, le premier serveur avec la paire d'adresse: port sera le serveur par défaut de cette paire.
Si vous en avez seulement 1 server
Directive, qui traitera toutes les demandes, vous n'avez rien à définir.
Plusieurs server
directif
Si vous souhaitez faire correspondre toute la demande avec spécifiée server
directive, ajoutez juste default_server
paramètre listen
, Nginx utilisera ceci server
directive par défaut.
server {
listen 80 default_server;
}
À propos de server_name _;
De Nginx Docs
Dans les exemples de serveur Catch-All, le nom étrange «_» peut être vu:
server { listen 80 default_server; server_name _; return 444; }
Il n'y a rien de spécial dans ce nom, c'est juste l'un d'une myriade de noms de domaine invalides qui ne se croisent jamais avec un vrai nom. D'autres noms non valides comme «-» et «! @ #» Peuvent également être utilisés.
Peu importe ce server_name
vous définissez, c'est juste un nom de domaine invalide.
Si vous souhaitez également prendre des demandes avec vide Host
en-tête (qui est autorisé à Http / 1.0) Vous pouvez utiliser à la fois Regex et vide server_name
:
server {
listen 80;
server_name ~. "";
}