Jak działa try_files?


72

Spojrzałem na dokumentację Nginx i nadal mnie to całkowicie myli.

Jak try_filesdziała Oto, co mówi dokumentacja:

Od NginxHttpCoreModule

try_files

składnia: try_files ścieżka1 [ścieżka2] uri

domyślnie: brak

kontekst: serwer, lokalizacja

dostępność: 0.7.27

Sprawdza istnienie plików w kolejności i zwraca pierwszy znaleziony plik. Końcowy ukośnik wskazuje katalog - $ uri /. W przypadku nie znalezienia pliku wywoływane jest wewnętrzne przekierowanie do ostatniego parametru. Ostatnim parametrem jest zastępczy identyfikator URI i musi on istnieć, w przeciwnym razie zostanie zgłoszony błąd wewnętrzny. W przeciwieństwie do przepisywania, $ args nie są automatycznie zachowywane, jeśli kopia zapasowa nie jest nazwaną lokalizacją. Jeśli chcesz zachować argumenty, musisz to zrobić jawnie:

Nie rozumiem, w jaki sposób sprawdza ścieżki i co zrobić, jeśli nie chcę błędu wewnętrznego, ale czy powinien wznowić resztę ścieżki w celu znalezienia innego pliku?

Jeśli chcę wypróbować plik z pamięci podręcznej /path/app/cache/url/index.htmli jeśli próba się nie powiedzie, /path/app/index.phpjak bym to napisał? Gdybym napisał:

try_files /path/app/cache/ $uri
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/php-fastcgi/php-fastcgi.socket;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;

Mam index index.php index.html index.htm;. Kiedy odwiedzić /urlname, będzie starał sprawdzanie /path/app/cache/urlname/index.phppotem /path/app/cache/urlname/index.html? Jeśli po wszystkim zignorujemy, try_filesczy możliwe try_filesjest sprawdzenie folderu pamięci podręcznej? Próbowałem i nie udało mi się.

Odpowiedzi:


64

try_files wypróbowuje dosłowną ścieżkę określoną w odniesieniu do zdefiniowanej dyrektywy root i ustawia wewnętrzny wskaźnik pliku. Jeśli użyjesz na przykład try_files /app/cache/ $uri @fallback;z, index index.php index.html;wtedy przetestuje ścieżki w następującej kolejności:

  1. $document_root/app/cache/index.php
  2. $document_root/app/cache/index.html
  3. $document_root$uri

przed ostatecznym wewnętrznym przekierowaniem do lokalizacji o nazwie @fallback. Możesz także użyć pliku lub kodu stanu ( =404) jako ostatniego parametru, ale jeśli używasz pliku, musi on istnieć .

Należy zauważyć, że same try_files nie spowoduje wewnętrznego przekierowania dla niczego poza ostatnim parametrem. Oznacza to, że nie możesz wykonać następujących czynności: try_files $uri /cache.php @fallback;ponieważ spowoduje to, że nginx ustawi wewnętrzny wskaźnik pliku na $ katalog_główny_dokumentu / cache.php i go obsłuży, ale ponieważ nie ma wewnętrznego przekierowania, lokalizacje nie są ponownie oceniane i jako takie będą służył jako zwykły tekst. (Powodem działa z plikami PHP jako wskaźnika jest, że dyrektywa wskaźnik będzie wydawać wewnętrzne przekierowanie)


2
To DUŻO bardziej jasne. Dzięki. Nie jestem pewien, jak działa nazwana lokalizacja. Jeśli @fallback zawiera wiersze dla fastcgi php, które mogłyby służyć jako plik php, a nie tekst? Czy rezerwowy system jest używany, gdy wszystko przed nim zawiedzie?

2
Nazwana lokalizacja jest funkcjonalnie identyczna z normalną lokalizacją, z tą różnicą, że można do niej uzyskać dostęp tylko za pośrednictwem wewnętrznych mechanizmów, takich jak strona_błędu i pliki_profilu. Powrót do pliku try_files jest używany tylko wtedy, gdy żadna z podanych ścieżek nie powoduje uzyskania poprawnego pliku. Nadal potrzebujesz lokalizacji do przechwycenia \ .php $ URI, ponieważ w przeciwnym razie try_files uruchomi się na $ uri, jeśli plik istnieje i będzie służył jako zwykły tekst.
Martin Fjordvald

Dziękuję za tę odpowiedź. Nadal mam pytanie: czy try_files jest wykonywany od razu, czy też próbowana będzie wcześniej zagnieżdżona lokalizacja?
Stphane

@Stphane Przenosisz się tutaj w mętne wody. Dziedziczenie w nginx jest złożone, chaotyczne i całkowicie niespójne. Musiałem przejrzeć moje stare notatki, aby to zapamiętać, więc nie ma gwarancji, ale wydaje się, że dla try_files, szczególnie w przypadku tylko zagnieżdżonych lokalizacji, nie zostanie wykonane, jeśli wewnętrzna lokalizacja pasuje. Poleciłbym to jednak przetestować.
Martin Fjordvald

5

Oto kolejne wygodne użycie try_files, jako bezwarunkowe przekierowania do nazwanych lokalizacji. Nazwane lokalizacje skutecznie działają jako podprogramy, oszczędzając powielania kodu. Gdy pierwszym argumentem dla try_files jest „_”, przekierowanie rezerwowe jest zawsze podejmowane.

    location =/wp-login.php { try_files _ @adminlock; }
    location ^~ /wp-admin/  { try_files _ @adminlock; }
    location @adminlock  {
            allow 544.23.310.198;
            deny all;
            try_files _ @backend;
            # wp-admin traffic is tiny so ok to send all reqs to backend 
    }
    location ~ \.php {  try_files _ @backend; }
    location / { try_files $uri $uri/ =403; }
    location @backend {
            fastcgi_pass 127.0.0.1:9000;
            include snippets/fastcgi-php.conf;
    }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.