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!

Était-ce utile?

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

De Nginx listen Docs

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 ~. "";
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top