nginx nom_serveur joker ou fourre-tout

119

J'ai une instance de nginx en cours d'exécution qui dessert 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 que toutes les autres demandes de domaine soient dirigées vers un seul index.php- j'ai beaucoup de domaines et de sous-domaines et il n'est pas pratique de les lister tous dans une configuration nginx.

Jusqu'à présent , j'ai essayé de placer server_nameà *mais qui a échoué en tant que caractère générique non valide. *.*fonctionne jusqu'à ce que j'ajoute les autres blocs de serveur, alors je suppose que cela entre en conflit avec eux.

Existe-t-il un moyen d'exécuter un bloc de serveur fourre-tout 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 un contenu utile, ils sont juste alimentés par le même CMS à partir d'une base de données!

Tak
la source
1
Il est préférable
stephen

Réponses:

147

Modifiez l'option d'écoute pour cela dans votre bloc de serveur fourre-tout. (Ajouter default_server) cela prendra toutes vos connexions non définies (sur le port spécifié).

listen       80  default_server;

si vous voulez tout pousser vers index.php si le fichier ou le dossier n'existe pas;

try_files                       $uri /$uri /index.php;
Mattias
la source
A parfaitement fonctionné - merci beaucoup. Je ne pouvais pas utiliser server_name _;pour la page de statut sur l'adresse IP, j'ai dû spécifier server_name x.x.x.xmais ça va!
Tak
1
L'ajout default_serverne semble pas fonctionner sur nginx 1.4.6 qui est actuellement la dernière version sur Ubuntu 14.04 ... Lorsque je l'ajoute, la configtestcommande renvoie une erreur et le redémarrage du serveur ne fonctionne pas non plus. J'ai essayé exactement la même configuration sur mon serveur avec Debian Jessie, qui a nginx 1.6.2, et cela fonctionne parfaitement. Alors essayez une autre version si vous êtes sur 1.4.6 ...
Nicomak
1
Note latérale pour HTTPS: la default_serverdirective définit également le serveur qui gérera l'établissement de liaison SSL pour les demandes sur ce port. Donc, si vous voulez que le bloc de serveur A gère SSL, mais que le serveur B agisse en tant que fourre-tout pour HTTPS, la solution consiste à définir server_name ~^(.+)$sur le serveur B.
Luc
66

Un simple trait de soulignement fonctionne également:

server_name  _;

Source: http://nginx.org/en/docs/http/server_names.html

jp.gouigoux
la source
2
Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et de fournir le lien pour référence. Les réponses aux liens uniquement peuvent devenir invalides si la page liée change.
Kmeixner
10
Le lien n'est fourni qu'à titre de référence. Les deux lignes ci-dessus sont en fait la réponse: mettre simplement un trait de soulignement comme valeur pour nom_serveur produira le comportement «attraper tout» souhaité.
jp.gouigoux
55
Cette réponse n'est pas vraie. La référence indique clairement que cela ne fonctionnera que si vous avez également listen 80 default_serverdans votre config.
Beetle
5
Consultez également cet article .
Beetle
2
Peut-être ai-je mal compris la documentation, mais "Il n'y a rien de spécial à propos de ce nom, il ne s'agit que de l'un d'une myriade de noms de domaine non valides qui ne se croisent jamais avec un nom réel. D'autres noms non valides tels que" - "et"! @ # "Peuvent être également utilisé. ". Alors, _est-ce juste un nom invalide ?
Florian Klein
26

Cela fonctionnera:

server_name ~^(.+)$
comonitos
la source
13
server_name ~.semble être plus efficace
youfu
2
Cela a fonctionné pour moi. Pour une raison quelconque, je ne pouvais pas faire fonctionner default_server, il remplaçait tous mes autres hôtes virtuels.
NeuroXc
11

Pour moi, définir en quelque sorte default_server ne fonctionnait pas. Je l'ai résolu par

server_name ~^.*$

en utilisant l'expression régulière de tous.

Ashish
la source
J'ai essayé toutes les options aux votes plus élevés et c'est la seule qui a fonctionné. REMARQUE: j'essaie d'accéder à un serveur avec son adresse IP et son URL.
Mampersat le
9

Une seule serverdirective

À partir de Nginx listenDocs

Le paramètre default_server, s'il est présent, fera que le serveur deviendra le serveur par défaut pour la paire adresse: port spécifiée. Si aucune des directives n'a le paramètre default_server, alors le premier serveur avec la paire adresse: port sera le serveur par défaut pour cette paire.

Si vous n'avez qu'une seule serverdirective, qui gérera toutes les demandes, vous n'avez rien à définir.


serverDirective multiple

Si vous voulez faire correspondre toutes les demandes avec la serverdirective spécifiée , ajoutez simplement un default_serverparamètre à listen, Nginx utilisera cette serverdirective par défaut.

server {
    listen 80 default_server;
}

À propos server_name _;

À partir de Nginx Docs

Dans les exemples de serveurs fourre-tout, le nom étrange «_» peut être vu:

server {
    listen       80  default_server;
    server_name  _;
    return       444;
}

Il n'y a rien de spécial à propos de 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 invalides tels que «-» et «! @ #» Peuvent également être utilisés.

Peu importe ce que server_namevous définissez, il s'agit simplement d'un nom de domaine invalide .

Aile de Steely
la source
5

Vous pouvez maintenant utiliser le 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

clignotant rouge
la source
2

Si vous souhaitez également intercepter les demandes avec un en- Hosttête vide (ce qui est autorisé dans HTTP / 1.0 ), vous pouvez utiliser à la fois regex et empty server_name:

server {
    listen      80;
    server_name ~. "";
}
Pavel Golubev
la source