2013-07-22 17 views
34

Próbuję zrozumieć, jak działa dyrektywa try_files nginx. nginx działa na moim serwerze i wyświetla domyślną stronę pod adresem /usr/share/nginx/html/index.html.Jak mogę sprawić, aby działała dyrektywa try_files?

Mam jednak prostą stronę html umieszczoną w systemie plików pod adresem /var/www/test/index.html. Poniższy plik konfiguracyjny nie powoduje dostarczenia tego pliku. Chciałbym zrozumieć, dlaczego nie, i jakie zmiany muszę wprowadzić, aby je obsłużyć.

Oto odnośny fragment 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

co miałeś na myśli kończąc '/' w linii 'try_files'? –

+0

Znaczenie opcji zastępczej to "/". Postać tuż przed ";" w tej linii. – Jonah

+0

cóż, musi to być plik, a nie URI, więc użyj $ uri/lub użyj /index.html –

Odpowiedz

115

bardzo częstym linia try_files, które mogą być stosowane od stanu jest

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

prawdopodobnie zrozumieć pierwszej części location / mecze wszystkie lokalizacje, chyba że są dopasowane przez dokładniejszą lokalizację, na przykład location /test, na przykład

Druga część (try_files) oznacza, że ​​po otrzymaniu identyfikatora URI dopasowanego przez ten blok najpierw spróbuj $uri, na przykład http://example.com/images/image.jpg nginx spróbuje sprawdzić, czy w pliku /images znajduje się plik o nazwie image.jpg, jeśli został znaleziony, aby go najpierw udostępnić.

Drugi warunek jest $uri/ co oznacza, jeśli nie znaleźliśmy pierwszy warunek $uri spróbować URI w katalogu, na przykład http://example.com/images/, ngixn najpierw sprawdzić, czy istnieje plik o nazwie images to przyzwyczajenie go znaleźć, a następnie udaje się do drugi check $uri/ i sprawdź, czy istnieje katalog o nazwie images, to spróbuje go wyświetlić.

uwaga Side: jeśli nie masz autoindex on będziesz prawdopodobnie uzyskać 403 błędu zabronione, ponieważ listing katalogu jest zabronione domyślnie.

EDIT: Zapomniałem wspomnieć, że jeśli masz index zdefiniowane, nginx spróbuje sprawdzić, czy indeks istnieje wewnątrz tego folderu przed próbuje listę katalogów.

Trzeci warunek /test/index.html jest uważany za upadek z powrotem opcja, (trzeba użyć co najmniej 2 opcje, jeden i cofać), można użyć tyle, ile można (nie czytać z przewężeniem wcześniej) , nginx wyszuka plik index.html w folderze test i wyświetli go, jeśli istnieje.

Jeśli trzeci warunek również się nie powiedzie, to nginx wyświetli stronę błędu 404.

Ponadto istnieje coś, co nazywa nazwane lokalizacje, tak

location @error { 
} 

można nazwać z try_files jak ten

try_files $uri $uri/ @error; 

TIP: Jeśli masz tylko 1 warunek, który ma służyć, jak na przykład wewnątrz folderu images chcesz tylko podać obraz lub przejść do błędu 404, możesz napisać linię taką jak ta

location /images { 
    try_files $uri =404; 
} 

co oznacza, że ​​należy podać plik lub podać błąd 404, nie można użyć tylko $uri przez niego bez numeru =404, ponieważ konieczne jest skorzystanie z opcji zastępczej.
Można również wybrać Który kiedykolwiek kod błędu, który ma, jak na przykład:

location /images { 
    try_files $uri =403; 
} 

To pokaże zabronionego błąd, jeśli obraz nie istnieje, lub jeśli używasz 500 to pokaże błąd serwera, etc ..

+0

Dzięki za to wyjaśnienie. W szczególności, co jest nie tak z kodem w moim OP? Udało mi się uruchomić go, umieszczając pliki try_files w bloku lokalizacji i używając nazwanego kreacji zastępczej. Czy dyrektywy try_files nie są dozwolone poza blokami lokalizacji? Lub jest problem, że w moim kodzie w OP awaryjnym jest "/"? – Jonah

+0

ok właśnie sprawdziłem dokumentację, http://wiki.nginx.org/HttpCoreModule#try_files, podobno działałoby poza blokiem lokalizacji, więc domyślam się, że problem polegał na tym, że nie masz opcji awaryjnej. –

+0

To wyjaśnienie jest bardzo pomocne! – skyfree

Powiązane problemy