web-dev-qa-db-fra.com

nginx nom_serveur avec caractère générique ou règle générale

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. La seconde 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 des charges de domaines et de sous-domaines et il est impossible de les répertorier dans une configuration nginx.

Jusqu'ici, j'ai essayé de définir server_name sur *, mais cela a échoué en tant que caractère générique non valide. *.* fonctionne jusqu'à ce que j'ajoute les autres blocs du serveur, alors je suppose que cela est en conflit avec eux.

Existe-t-il un moyen d'exécuter un bloc serveur fourre-tout dans nginx après la définition d'autres sites?

N.B. 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!

92
Tak

Changez l’option listen en ceci dans votre bloc 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 dans index.php si le fichier ou le dossier n'existe pas;

try_files                       $uri /$uri /index.php;
123
Mattias

Un soulignement simple fonctionne également:

server_name  _;

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

49
jp.gouigoux

Cela fonctionnera:

server_name ~^(.+)$
21
comonitos

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

server_name ~^.*$

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

7
Ashish

Seulement 1 directive server

De Nginx listen Docs

Le paramètre default_server, s'il est présent, provoquera le serveur à devenir le serveur par défaut pour l'adresse spécifiée: paire de ports. Si aucun des directives ont le paramètre default_server puis le premier serveur avec l'adresse: paire de ports sera le serveur par défaut pour cela paire.

Si vous ne disposez que d'une directive server qui gérera toutes les demandes, vous n'avez rien besoin de définir.


Directive server multiple

Si vous souhaitez faire correspondre toutes les demandes avec la directive server spécifiée, ajoutez simplement le paramètre default_server à listen, Nginx utilisera cette directive server par défaut.

server {
    listen 80 default_server;
}

À propos de server_name _;

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;
}

Ce nom n’a rien de spécial, ce n’est qu’un myriade de noms de noms de domaine invalides qui ne se croisent jamais avec un nom réel . D'autres noms non valides, tels que “-” et “! @ #” Peuvent également être utilisés.

Peu importe le server_name que vous avez défini, il ne s'agit que d'un nom de domaine invalide.

2
Steely Wing

Maintenant vous pouvez 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

1
redflasher

Si vous souhaitez également intercepter des demandes avec un en-tête Host vide (autorisé dans HTTP/1.0 ), vous pouvez utiliser à la fois regex et server_name vide:

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