Warum akzeptiert Nginx jeden URL-Wert nach der Stammdomäne?

Warum akzeptiert Nginx jeden URL-Wert nach der Stammdomäne?

Ich richte Nginx zum ersten Mal ein und mein Ziel ist es, example.com mit einer statischen „index.html“-Seite mit einer minimalistischen Konfiguration bereitzustellen, mehr nicht. Ich möchte auch die www-Subdomain löschen. Hier sind meine für Websites verfügbaren Serverblöcke:

server {
    server_name www.example.com;
    return 301 $scheme://example.com$request_uri;
}

server {
    server_name example.com;
    root /var/www/example.com/;
    index index.html index.htm;

    location / {
            try_files $uri $uri/ /index.html;
    }
}

Wenn ich www.example.com oder example.com verwende, funktionieren sie einwandfrei, wobei „www“ automatisch gelöscht wird.

Mein Problem ist, dass ich nach example.com alles eingeben kann und die Seite index.html trotzdem geladen wird, etwa example.com/ABC oder example.com/12345.Diese Seiten existieren nicht. Warum werden die URLs akzeptiert? Ich würde erwarten, dass jede andere URL als die Domänen-Root stattdessen eine 404-Seite zurückgibt.

Dies ist wahrscheinlich ein sehr einfaches Problem, aber ich habe hier und in den Dokumenten gesucht und bisher nichts gefunden.

Antwort1

Dies scheint das korrekte Verhalten der try_files-Klausel zu sein. Aus dem Nginx-Wiki:

Überprüft in der richtigen Reihenfolge, ob Dateien vorhanden sind, und gibt die erste gefundene Datei zurück. Ein abschließender Schrägstrich zeigt ein Verzeichnis an – $uri /. Falls keine Datei gefunden wird, wird eine interne Umleitung zum letzten Parameter aufgerufen. Beachten Sie, dass nur der letzte Parameter eine interne Umleitung bewirkt, frühere Parameter setzen lediglich den internen URI-Zeiger.

Wenn Sie also nach ABC oder 12345 suchen und diese nicht gefunden werden können, wird eine interne Weiterleitung zu index.html aufgerufen.

Versuche es mit:

location / {
    try_files $uri $uri/ =404;
}

Eine vollständige Referenz finden Sie hier:

http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files

Basierend auf Martin FjordvaldsKommentarhier ist die Minimalkonfiguration für die beiden Serverblöcke, getestet und funktionsfähig:

server {
    server_name www.example.com;
    return 301 $scheme://example.com$request_uri;
}

server {
    server_name example.com;
    root /var/www/example.com/;
    index index.html index.htm;
}

Antwort2

2 Dinge, die mir einfallen:

entweder hast du eine Rewriterregel zurück zur index.html

oder es könnte sein, dass Sie eine benutzerdefinierte 404-Seite haben, die auf die index.html zurückverlinkt ist

zumindest wären das die beiden Ideen, die ich zuerst prüfen würde.

eine andere mögliche Lösung wäre, die Protokolle zu prüfen, Werte zum Debuggen festzulegen und zu prüfen, was Sie zurück zur Datei index.html „umleitet“. Leider kenne ich mich mit Nginx nicht gut genug aus, um Ihnen weiterhelfen zu können.

verwandte Informationen