nginx Servername Platzhalter oder Catch-All

118

Ich habe eine Instanz von Nginx, die mehrere Websites bedient. Die erste ist eine Statusmeldung zur IP-Adresse des Servers. Die zweite ist eine Administratorkonsole admin.domain.com. Diese funktionieren großartig. Jetzt möchte ich, dass alle anderen Domain-Anfragen an eine einzelne gehen index.php- ich habe viele Domains und Subdomains und es ist unpraktisch, sie alle in einer Nginx-Konfiguration aufzulisten.

Bisher habe ich versucht Einstellung server_namezu , *aber das als eine ungültige Platzhalter fehlgeschlagen. *.*funktioniert, bis ich die anderen Serverblöcke hinzufüge, dann denke ich, dass es Konflikte mit ihnen gibt.

Gibt es eine Möglichkeit, einen Catch-All-Serverblock in Nginx auszuführen, nachdem andere Sites definiert wurden?

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

Tak
quelle
1
Am besten als primäre Quelle verwenden nginx.org/en/docs/http/server_names.html
stephen

Antworten:

147

Ändern Sie die Listen-Option in Ihrem Catch-All-Serverblock. (Hinzufügen default_server) Hiermit werden alle nicht definierten Verbindungen (am angegebenen Port) ausgeführt.

listen       80  default_server;

Wenn Sie alles in die Datei index.php verschieben möchten, wenn die Datei oder der Ordner nicht vorhanden ist.

try_files                       $uri /$uri /index.php;
Mattias
quelle
Hat perfekt funktioniert - vielen Dank. Ich konnte nicht server_name _;für die Statusseite die IP-Adresse verwenden, ich musste angeben, server_name x.x.x.xaber das ist okay!
Tak
1
Das Hinzufügen default_serverscheint unter nginx 1.4.6, der derzeit neuesten Version unter Ubuntu 14.04 configtest, nicht zu funktionieren. Wenn ich es hinzufüge, gibt der Befehl einen Fehler zurück, und ein Neustart des Servers funktioniert auch nicht. Ich habe genau die gleiche Konfiguration auf meinem Server mit Debian Jessie versucht, die Nginx 1.6.2 hat, und es funktioniert perfekt. Also versuchen Sie eine andere Version, wenn Sie auf 1.4.6 sind ...
Nicomak
1
Randnotiz für HTTPS: Die default_serverDirektive legt auch den Server fest, der den SSL-Handshake für Anforderungen an diesem Port verarbeitet. Wenn Sie also möchten, dass Serverblock A SSL verarbeitet, Server B jedoch als Catchall für HTTPS fungiert, müssen Sie die Lösung server_name ~^(.+)$auf Server B festlegen .
Luke
65

Ein einfacher Unterstrich funktioniert auch:

server_name  _;

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

jp.gouigoux
quelle
1
Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert.
Kmeixner
10
Der Link dient nur als Referenz. Die beiden obigen Zeilen sind tatsächlich die Antwort: Durch einfaches Setzen eines Unterstrichs als Wert für Servername wird das gewünschte Verhalten "Alle fangen" erzeugt.
jp.gouigoux
54
Diese Antwort ist nicht wahr. Die Referenz macht deutlich, dass dies nur funktioniert, wenn Sie es auch listen 80 default_serverin Ihrer Konfiguration haben.
Käfer
5
Siehe auch diesen Artikel .
Käfer
2
Vielleicht habe ich die Dokumente falsch verstanden, aber "Dieser Name hat nichts Besonderes, er ist nur einer von unzähligen ungültigen Domainnamen, die sich nie mit einem echten Namen überschneiden. Andere ungültige Namen wie" - "und"! @ # "Können gleichermaßen verwendet werden. ". Ist _also nur ein ungültiger Name?
Florian Klein
26

Das wird funktionieren:

server_name ~^(.+)$
comonitos
quelle
13
server_name ~.scheint effizienter zu sein
Youfu
2
Das hat bei mir funktioniert. Aus irgendeinem Grund konnte ich default_server nicht zum Laufen bringen, es überschrieb alle meine anderen vhosts.
NeuroXc
11

Für mich hat default_server irgendwie nicht funktioniert. Ich habe es gelöst durch

server_name ~^.*$

mit regulären Ausdruck von allen.

Ashish
quelle
Versuchte alle Optionen mit höheren Stimmen und dies ist die einzige, die funktioniert hat. HINWEIS: Ich versuche, zu einem Server mit seiner IP-Adresse im Vergleich zur URL zu gelangen.
Mampersat
9

Nur 1 serverRichtlinie

Aus Nginx listenDocs

Wenn der Parameter default_server vorhanden ist, wird der Server zum Standardserver für das angegebene Adress-Port-Paar. Wenn keine der Anweisungen den Parameter default_server hat, ist der erste Server mit der Adresse: Port-Paar der Standardserver für dieses Paar.

Wenn Sie nur eine serverDirektive haben, die alle Anforderungen verarbeitet, müssen Sie nichts festlegen.


mehrere serverRichtlinie

Wenn Sie alle Anforderungen mit der angegebenen serverDirektive abgleichen möchten , fügen Sie einfach default_serverParameter hinzu listen. Nginx verwendet diese serverDirektive als Standard.

server {
    listen 80 default_server;
}

Über server_name _;

Aus Nginx Docs

In Catch-All-Server-Beispielen 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 ungültigen Domainnamen, die sich nie mit einem echten Namen überschneiden. Andere ungültige Namen wie "-" und "! @ #" Können ebenfalls verwendet werden.

Es spielt keine Rolle, was server_nameSie festlegen, es ist nur ein ungültiger Domainname .

Steely Wing
quelle
2

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

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