Wie konfiguriere ich einen Standortblock so, dass immer eine einzelne Datei in Nginx zurückgegeben wird?

12

In meiner Anwendung möchte ich, dass der Speicherort "/" eine statische index.html-Datei zurückgibt, dass "/ static" statische Dateien aus einem Ordner bereitstellt und dass alle anderen Anforderungen 404 NOT FOUND zurückgeben. Zu einem späteren Zeitpunkt werde ich alle anderen Anforderungen an einen WSGI-Server umleiten.

Dies ist derzeit meine Konfiguration:

# Dev server.
server {
    listen 1337;
    charset UTF-8;

    location / {
        rewrite ^ static/index_debug.html break;
    }

    location /static {
        alias /home/tomas/projects/streamcore/static;
    }
}

Der statische Ordner funktioniert einwandfrei, aber "/" gibt 404 NOT FOUND zurück. Ich habe auch versucht:

alias /home/tomas/projects/streamcore/static/index_debug.html;

Im Standortblock gibt dies jedoch 500 INTERNAL SERVER ERROR zurück. Es scheint, als würde aliases keine einzelnen Dateien mögen. Zusätzlich habe ich versucht:

try_files static/index_debug.html;

Dies verhindert jedoch, dass der Server mit dem Fehler "Ungültige Anzahl von Argumenten in der Anweisung try_files" beginnt. Anscheinend try_filesmüssen Sie tatsächlich mehr als eine Datei ausprobieren, was nicht das Verhalten ist, nach dem ich suche.

Meine Frage lautet also: Wie konfiguriere ich einen Standortblock, um immer eine statische Datei zurückzugeben?


EDIT: Ich habe aus anderen Antworten gesehen, dass aliastatsächlich eine einzelne Datei als Argument akzeptiert werden sollte, also habe ich versucht:

location = / {
    alias /home/tomas/projects/streamcore/static/index_debug.html;
}

Aber ich bekomme immer noch nur 500 INTERNAL SERVER ERROR. Das Fehlerprotokoll für die Anforderung "/" lautet:

[alert] 28112 # 0: * 7 "/home/tomas/projects/streamcore/static/index_debug.htmlindex.html" ist kein Verzeichnis

Warum wird versucht, "index_debug.htmlindex.html" zu öffnen? Ich verwende die indexRichtlinie nirgendwo.

Hubro
quelle
Können Sietry_files static/index_debug.html static/index_debug.html;
ceejayoz
@ceejayoz: Wenn location =/ich Ihren Vorschlag versuche, location /bekomme ich 404 NOT FOUND, mit 500 INTERNAL SERVER ERROR.
Hubro
Wenn ich mich nicht irre, fehlt Ihnen die Index-Direktive ... Jeder Webserver sucht immer nach der Indexdatei und gibt den Stamm-URI (/) an. Ich denke, Sie können dies überschreiben, indem Sie Folgendes hinzufügen:location / { return 404; }
Martino Dino
@ Martinino: Warum brauche ich das? Und wo?
Hubro
location = / {Index /home/tomas/projects/streamcore/static/index_debug.html;}
Martino Dino

Antworten:

10

Habe das gerade getestet und es funktioniert bei mir:

server {
    root /tmp/root;
    server {
        listen 8080;
        location /static {
            try_files $uri =404;
        }
        location / {
            rewrite ^ /static/index_debug.html break;
        }
    }
}

Die Datei /tmp/root/static/index_debug.htmlexistiert natürlich :)

Ich kann jede URL treffen und bekomme nur die statische Seite.

chrskly
quelle
0

Sie können try_files und eine Umleitung zu einem benannten Speicherort mit Umschreiben verwenden. So was:

server {
    root /tmp/root;
    server {
        listen 8080;

        location / {
            try_files $uri $uri/ @index;
        }

        location @index {
            rewrite ^ static/index_debug.html break;
        }
    }
}

Wenn eine Datei darin vorhanden ist /tmp/root, wird sie zugestellt, andernfalls wird uri neu geschrieben static/index_debug.htmlund zugestellt .

Kirill Zaitsev
quelle