Benutzerdefinierter Statuscode für die Nginx-Standardseite

7

Ich habe nur Erfahrung mit Upstreams in Nginx, nicht mit der Bereitstellung statischer Dateien.

Nginx hat einen Standardserver, der ein Willkommen bei Nginx bietet ! Seite und wird angezeigt, wenn auf den virtuellen Hosts keine Übereinstimmung vorliegt. Ich möchte diese Standardseite beibehalten, aber den 200- Statuscode auf 404 überschreiben .

Ich bin mir nicht sicher, wie ich das anstellen soll. Irgendwelche Ideen?

Niels B.
quelle

Antworten:

6

Sie können eine Seite mit einem Fehlercode mit zurückgeben

error_page 404 /index.html;

Solange rootin Ihrem Serverblock der Standardpfad von nginx definiert ist. Nginx.org verfügt über eine umfassende Dokumentation zu all dem, die es wert ist, überprüft zu werden.

Umschreiben 200

Ist gefährlich. Sie können jedoch verwenden, returnum mit Anfragen an eine andere Stelle auf Ihrem Server zu antworten, wodurch die Anweisung error_page ordnungsgemäß aufgerufen wird. Wenn Sie dies am Ende Ihres Serverblocks einfügen, dient es als Sammelbegriff für Anforderungen, die an keiner anderen Stelle angegeben sind:

location / {
    return 404;
}

Hier sind die Dokumente für return.

Um wirklich pedantisch zu sein, können Sie auch die Anweisung error_page weglassen und stattdessen einfach die Weiterleitungs-URL schreiben (für die Codes 301, 302, 303, 307 und 308 ab Version 0.8.42):

location / { 
    root /path/to/www/nginx;
    return 301 /index.html;
}

Oder der Antworttext (für andere Codes):

location / { 
    root /path/to/www/nginx;
    return 404 '404 error';
}

... aber es kann schwierig sein, Fehler zu beheben, wenn etwas schief geht.


Eine kleine Ausarbeitung

Nginx hat eine ziemlich einfache Syntax zum Trennen zwischen Statuscodes und Seiten. Innerhalb eines serverBlocks können Sie definieren, rootwo nginx nach den angeforderten statischen Seiten sucht. Wenn eine statische Seite angefordert und nicht gefunden wird oder nicht gelesen werden kann oder etwas anderes passiert, erhält nginx einen Statuscode und führt eine Aktion aus. Wenn dieser Code 200 ist, verarbeitet er HTML, PHP oder was auch immer, was eine Reihe von Anforderungen an das Dateisystem oder einen anderen Socket auslösen kann (und dies häufig tut), um diesen oder jenen Teil Ihrer Seite bereitzustellen. Die Ergebnisse bei Erfolg werden an den Browser-Client gesendet, und bei einem Fehler wird die Standardseite für den Fehler zurückgegeben. In beiden Fällen wird auch der Statuscode zurückgegeben (was eine browserbasierte Anpassung von 404 und anderen Fehlern ermöglicht).

Die error_pageDirektive teilt nginx lediglich mit, welcher Anforderung als Nächstes zu folgen ist. In der Praxis muss diese Anforderung nicht einmal eine Datei auf der Festplatte sein. Es kann ein Name locationmit eigenen Regeln sein. Die Standardkonfiguration für nginx veranschaulicht dies recht gut:

error_page 500 502 503 504 /50x.html;
location = /50x.html {
    root /usr/share/nginx/www;
}

Beim Abrufen eines 503 fordert nginx /50x.html an, und die location-Anweisung für jede Anforderung an 50x.html definiert den Stammpfad, in dem nach dieser Datei gesucht werden soll.

Ryder
quelle
5
return 404 /index.html;tut nicht das, was ich denke du denkst es tut. Es gibt einen 400-Statuscode und den Text "/index.html" zurück (nicht den Inhalt dieser Seite).
Jwadsack