2013-07-22 14 views
34

Ich versuche zu verstehen, wie die nginx-Anweisung try_files funktioniert. nginx läuft auf meinem Server und bietet die Standardseite unter /usr/share/nginx/html/index.html an.Wie kann ich diese try_files Direktive arbeiten lassen?

Allerdings habe ich eine einfache HTML-Seite im Dateisystem unter /var/www/test/index.html. Die folgende Konfigurationsdatei verursacht nicht, dass diese Datei bereitgestellt wird. Ich würde gerne verstehen, warum nicht, und welche Veränderungen ich machen muss, damit es serviert wird.

Hier ist der relevante Teil der defualt.conf:

server { 
    listen  80; 
    server_name localhost; 

    root /var/www; 
    try_files /test/index.html /; 

    location/{ 
     root /usr/share/nginx/html; 
     index index.html index.htm; 
    } 
+0

was meintest du mit dem schleppenden '/' in der 'try_files' Zeile? –

+0

Das bedeutet, die Fallback-Option ist ein "/". Der Charakter direkt vor dem ";" in dieser Zeile. – Jonah

+0

Nun, es muss eine Datei sein, keine URI, also benutze $ uri/oder benutze /index.html –

Antwort

115

eine sehr häufige try_files Linie, die auf Ihrem Zustand

ist angewendet werden kann
location/{ 
    try_files $uri $uri/ /test/index.html; 
} 

Sie wahrscheinlich verstehen, der erste Teil, location / Streichhölzer alle Standorte, es sei denn, es wird durch einen spezifischen Ort, wie location /test zum Beispiel

Der zweite Teil (die try_files) bedeutet, wenn Sie einen URI erhalten, der mit diesem Block übereinstimmt, versuchen Sie $uri zuerst, zum Beispiel http://example.com/images/image.jpg nginx wird versuchen, zu überprüfen, ob es eine Datei innerhalb /images namens image.jpg, wenn gefunden, wird es zuerst dienen.

Zweite Bedingung ist $uri/ was bedeutet, wenn Sie nicht die erste Bedingung $uri versuchen gefunden, überprüfen Sie die URI als ein Verzeichnis, zum Beispiel http://example.com/images/, ngixn wird zuerst, wenn eine Datei mit dem Namen images existiert dann pflegt sie es finden, dann geht zweite Überprüfung $uri/ und sehen, ob es ein Verzeichnis namens images existiert dann wird es versuchen, es zu dienen.

Exkurs: Wenn Sie nicht über autoindex on Sie werden wahrscheinlich einen 403 verboten Fehler erhalten, weil Verzeichnisliste standardmäßig verboten ist.

EDIT: Ich habe vergessen zu erwähnen, dass, wenn Sie index definiert haben, nginx werden versuchen, zu überprüfen, ob der Index in diesem Ordner, bevor existiert Verzeichnisliste zu versuchen.

Dritte Bedingung /test/index.html wird eine Fallback-Option in Betracht gezogen, (Sie müssen mindestens 2 Optionen verwenden, ein und einen Sturz zurück), können Sie so viel verwenden, wie Sie können (nie vor einer Verengung lesen) sucht nginx im Ordner test nach der Datei index.html und bedient sie, falls sie existiert.

Wenn die dritte Bedingung auch fehlschlägt, wird nginx die 404-Fehlerseite bedienen.

Auch gibt es etwas namens Orte genannt, wie diese

location @error { 
} 

Sie es mit try_files wie diese

try_files $uri $uri/ @error; 

TIP anrufen: Wenn Sie nur 1 Bedingung, die Sie dienen wollen, müssen, wie zum Beispiel im Ordner images möchten Sie nur entweder das Bild liefern oder 404 Fehler gehen, können Sie eine Zeile wie diese

012 schreiben
location /images { 
    try_files $uri =404; 
} 

was bedeutet, dass entweder die Datei dienen oder einen 404-Fehler dienen, nicht nur $uri, indem sie es selbst ohne =404, weil Sie eine Ersatzoption haben müssen verwenden können.
Sie können auch wählen, welche jemals Fehlercode Sie, wie zum Beispiel wollen:

location /images { 
    try_files $uri =403; 
} 

Diesen einen verbotenen Fehler zeigen, wenn das Bild nicht vorhanden ist, oder wenn Sie 500 verwenden wird es Server-Fehler zeigen, usw. ..

+0

Danke für diese Erklärung. Was ist mit dem Code in meinem OP falsch? Ich war in der Lage, es zum Laufen zu bringen, indem ich die try_files in einen Standortblock setzte und ein benanntes Fallback verwendete. Sind try_files Direktiven außerhalb von Location Blocks nicht erlaubt? Oder ist das Problem, dass in meinem Code in der OP der Fallback ein "/" ist? – Jonah

+0

ok Ich habe gerade die Dokumentation http://wiki.nginx.org/HttpCoreModule#try_files überprüft, anscheinend würde es außerhalb des Standortblocks funktionieren, also denke ich, das Problem war, dass Sie keine Fallback-Option hatten. –

+0

Diese Erklärung ist sehr hilfreich! – skyfree

Verwandte Themen