Warum gibt eine Return-Anweisung in nginx.conf möglicherweise den Speicherort einer Klartextdatei an den Browser zurück, anstatt der tatsächlich darzustellenden Datei?

Warum gibt eine Return-Anweisung in nginx.conf möglicherweise den Speicherort einer Klartextdatei an den Browser zurück, anstatt der tatsächlich darzustellenden Datei?

Umfeld:Nginx, Node.js

Ich experimentiere mit der Fehlerbehandlung in Nginx und habe kein Glück beim Zurückgeben von Dateien.

Im vereinfachten Beispiel ngxinx.confunten, wenn das http request_methodnicht der Fall ist GET, HEADoder POSTich möchte, dass der Server die Fehlerseite 405.html zurückgibt.

Erhoffte Ausgabe:405.html wird an den Browser gesendet.

Tatsächliche Ausgabe:Dieser Klartext wird an den Browser gesendet. http://www.example.com/html/405.html

Hinweis: Ich teste dies in Postman, damit ich in Chrome keine zusätzliche Erweiterung installieren muss, die das Senden verschiedener HTTP-Methoden an den Server ermöglicht.

Relevante Teile meiner Konfiguration:

server {

    include conf.d/listen-80;

    server_name example.com www.example.com;

    if ($request_method !~ ^(GET|HEAD|POST)$) {
        return 405 $scheme://www.example.com/html/405.html;
    }

    return 301 https://www.example.com$request_uri;

}

server {

    include conf.d/listen-443;

    server_name example.com;

    include conf.d/letsencrypt;

    if ($request_method !~ ^(GET|HEAD|POST)$) {
        return 405 $scheme://www.example.com/html/405.html;
    }

    return 301 https://www.example.com$request_uri;

}

server {

    include conf.d/listen-443;

    server_name www.example.com;

    include conf.d/letsencrypt;

    if ($request_method !~ ^(GET|HEAD|POST)$) {
        return 405 $scheme://www.example.com/html/405.html;
    }

    root /srv/example/views/public;

    location ~* \.(htm|html)$ {
        include conf.d/content-security-policy-html-rendered;
        include conf.d/cache-control-30-days;
        include conf.d/security-headers-html-rendered;
    }
}

Antwort1

Die folgende URL return nnnwird nur als Ziel-URL für Umleitungscodes (Statuscodes 301, 302, 303, 307 und 308) behandelt. Aus der Dokumentation geht nicht klar hervor, was sie tut, wenn der Code etwas anderes ist.

Um in Ihrem Fall eine Fehlerseite zu erhalten, verwenden Sie Folgendes:

if ($request_method !~ ^(GET|HEAD|POST)$) {
    return 405;
}

error_page 405 /html/405.html;

Dadurch wird nginx angewiesen, zu senden, /html/405.htmlwenn der Statuscode 405 zurückgegeben wird.

verwandte Informationen