it-swarm.com.de

nginx Servername Wildcard oder Catch-All

Ich habe eine Instanz von nginx, die mehrere Websites bedient. Die erste ist eine Statusmeldung auf der IP-Adresse des Servers. Die zweite ist eine Administrationskonsole auf admin.domain.com. Diese arbeiten großartig. Nun möchte ich, dass alle anderen Domain-Anfragen zu einem einzigen index.php gehen - ich habe jede Menge Domains und Subdomains und es ist unpraktisch, sie alle in einer Nginx-Konfiguration aufzulisten.

Bisher habe ich versucht, server_name auf * zu setzen, was jedoch als ungültiger Platzhalter fehlgeschlagen ist. *.* funktioniert, bis ich die anderen Serverblöcke hinzufüge, und ich denke, es steht im Konflikt mit ihnen.

Gibt es eine Möglichkeit, einen catch-all-Serverblock in nginx auszuführen, nachdem andere Sites definiert wurden?

N.B. Ich bin kein Spammer, dies sind echte Websites mit nützlichen Inhalten, sie werden nur mit demselben CMS aus einer Datenbank betrieben!

92
Tak

Ändern Sie die Höroption in Ihrem catch-all-Serverblock. (Hinzufügen default_server) Dies nimmt alle Ihre nicht definierten Verbindungen (am angegebenen Port) auf.

listen       80  default_server;

wenn Sie alles auf index.php verschieben möchten, falls die Datei oder der Ordner nicht vorhanden ist;

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

Ein einfacher Unterstrich funktioniert auch:

server_name  _;

Quelle: http://nginx.org/de/docs/http/server_names.html

49
jp.gouigoux

Das wird funktionieren:

server_name ~^(.+)$
21
comonitos

Bei mir war irgendwie der default_server defekt. Ich habe es durch gelöst

server_name ~^.*$

mit regulären Ausdruck von allen.

7
Ashish

Nur eine server-Direktive

Von Nginx listen Docs

Wenn der Parameter default_server vorhanden ist, führt dies dazu, dass der Server Standardserver für das angegebene Adresse: Port-Paar werden. Wenn keine der Direktiven haben den Parameter default_server und dann den ersten Server mit dem Adresse: Port-Paar ist der Standardserver für diese Paar.

Wenn Sie nur eine server-Direktive haben, die alle Anforderungen behandelt, müssen Sie nichts einstellen.


Mehrere server-Direktive

Wenn Sie alle Anforderungen mit der angegebenen server-Direktive abgleichen möchten, fügen Sie einfach listendefault_server-Parameter hinzu. Nginx verwendet diese server-Direktive als Standard.

server {
    listen 80 default_server;
}

Über server_name _;

Von Nginx-Dokumenten

In catch-all Serverbeispielen ist der seltsame Name "_" zu sehen:

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

Dieser Name hat nichts Besonderes, er ist nur einer von unzähligen von ungültigen Domain-Namen, die sich niemals mit einem echten Namen überschneiden . Andere ungültige Namen wie "-" und "! @ #" Können ebenfalls verwendet werden.

Es spielt keine Rolle, welchen server_name Sie festlegen, es handelt sich lediglich um einen ungültigen Domänennamen.

2
Steely Wing

Jetzt kannst du mask benutzen:

server {
    listen       80;
    server_name  *.example.org;
    ...
}

server {
    listen       80;
    server_name  mail.*;
    ...
}

Weitere Informationen finden Sie hier: http://nginx.org/de/docs/http/server_names.html

1
redflasher

Wenn Sie auch Anforderungen mit leerem Host-Header abfangen möchten (was in HTTP/1.0 zulässig ist), können Sie sowohl regulären Ausdruck als auch leeren server_name verwenden:

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