Come funziona try_files?


72

Ho guardato la documentazione di nginx e mi confonde ancora del tutto.

Come try_filesfunziona? Ecco cosa dice la documentazione:

Da NginxHttpCoreModule

try_files

sintassi: try_files path1 [path2] uri

impostazione predefinita: nessuna

contesto: server, posizione

disponibilità: 0.7.27

Verifica l'esistenza dei file in ordine e restituisce il primo file trovato. Una barra finale indica una directory - $ uri /. Nel caso in cui non venga trovato alcun file, viene richiamato un reindirizzamento interno all'ultimo parametro. L'ultimo parametro è l'URI di fallback e deve esistere, altrimenti verrà generato un errore interno. Diversamente dalla riscrittura, $ args non viene automaticamente conservato se il fallback non è un percorso denominato. Se hai bisogno di args preservati, devi farlo esplicitamente:

Non capisco come controlla i percorsi e cosa succede se non voglio un errore interno ma devo riprendere il resto del percorso nel tentativo di trovare un altro file?

Se voglio provare un file memorizzato nella cache /path/app/cache/url/index.htmle se non riesce a provare /path/app/index.phpcome lo scriverei? Se scrivessi:

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;

Io ho index index.php index.html index.htm;. Quando visito /urlname, proverò a controllare /path/app/cache/urlname/index.phpallora /path/app/cache/urlname/index.html? Se ignoriamo tutto dopo, try_filesè possibile try_filescontrollare la cartella della cache? Ho provato e ho fallito.

Risposte:


64

try_files prova il percorso letterale specificato in relazione alla direttiva radice definita e imposta il puntatore al file interno. Se usi ad esempio try_files /app/cache/ $uri @fallback;con index index.php index.html;allora testerà i percorsi in questo ordine:

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

prima del reindirizzamento interno alla posizione denominata @fallback. È inoltre possibile utilizzare un file o un codice di stato ( =404) come ultimo parametro, ma se si utilizza un file deve esistere .

Si noti che try_files stesso non emetterà un reindirizzamento interno per tutto tranne l'ultimo parametro. Ciò significa che non è possibile effettuare le seguenti operazioni: try_files $uri /cache.php @fallback;in questo modo nginx imposta il puntatore del file interno su $ document_root / cache.php e lo serve, ma poiché non ha luogo alcun reindirizzamento interno, le posizioni non vengono rivalutate e come tali servito come testo semplice. (Il motivo per cui funziona con i file PHP come l'indice è che la direttiva dell'indice si rilascia un reindirizzamento interno)


2
Questo è MOLTO più chiaro. Grazie. Non sono sicuro di come funzioni la posizione indicata. Se @fallback ha linee per fastcgi php che lo servirebbero come file php anziché come testo? Il fallback viene utilizzato quando tutto ciò che precede non riesce?

2
Una posizione denominata è solo funzionalmente identica a una posizione normale, tranne per il fatto che è possibile accedervi solo tramite meccanismi interni come error_page e try_files. Il fallback in try_files viene utilizzato solo quando nessuno dei percorsi specificati genera un file valido. Hai ancora bisogno di una posizione per catturare \ .php $ URI poiché altrimenti try_files si attiverà su $ uri se il file esiste e lo serve come testo normale.
Martin Fjordvald,

Grazie per questa risposta. Ho ancora una domanda qui: try_files viene eseguito immediatamente o verrà tentata la posizione nidificata prima?
Stphane,

@Stphane Ti stai trasferendo in acque torbide qui. L'ereditarietà in nginx è complessa, disordinata e del tutto incoerente. Ho dovuto rivedere i miei vecchi appunti solo per ricordare questo, quindi nessuna garanzia, ma sembra che per try_files, in particolare quando si tratta solo di posizioni nidificate, non verrà eseguito se la posizione interna corrisponde. Consiglierei di provarlo, comunque.
Martin Fjordvald,

5

Ecco un altro comodo uso di try_files, come reindirizzamenti incondizionati a posizioni denominate. Le posizioni nominate agiscono effettivamente come subroutine, risparmiando la duplicazione del codice. Quando il primo argomento di try_files è "_", viene sempre utilizzato il reindirizzamento di fallback.

    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;
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.