2011-12-08 8 views
17

Sto cercando di ottimizzare le mie direttive di "posizione" e non riesco a trovare un buon metodo per determinare se una corrispondenza specifica di località viene tentata. L'utilizzo di echo all'interno del blocco di posizione non aiuta qui.Come controllare l'ordine di corrispondenza direttiva 'Location' di NGINX?

The NGINX ngx_http_core_module documentation è un po 'di confusione.

Per usare le espressioni regolari, è necessario utilizzare un prefisso:

  1. ~ Per maiuscole e minuscole corrispondenti

  2. ~* Per case insensitive corrispondenza

Come si esegue il match:

  1. Direttive con il prefisso = che corrispondono esattamente alla query. Se trovato, la ricerca si interrompe.

  2. Tutte le direttive rimanenti con stringhe convenzionali. Se questa corrispondenza utilizza il prefisso ^~, la ricerca si interrompe.

  3. Espressioni regolari, nell'ordine in cui sono definite nel file di configurazione.

  4. Se # 3 ha prodotto una corrispondenza, viene utilizzato tale risultato. In caso contrario, viene utilizzata la corrispondenza da # 2.

numero 2 qui dice "stringhe convenzionali", ma poi dice che può essere utilizzato con il prefisso ^~. ~ non implica un RegExp? In caso contrario, come determina cosa è un non è un RegExp?

In particolare, voglio il seguente:

  1. servire qualcosa di letterale /assets direttamente. STOP RICERCA.

  2. Serve tutto ciò che corrisponde RegExp \.php$|/$ tramite fast-CGI STOP SEARCH.

  3. Serve tutto il resto direttamente tramite letterale /

In questo modo, v'è solo un tentativo di / partita per i file non dinamici serviti al di fuori di attività.

ho:

location ^~ /assets {}  # search-terminating literal? or regex? 
location ~ \.php$|/$ {} 
location/{}    # is this match always attempted? 

Dal documento, sembra che l'ordine effettivo sarebbe 1-3-2, sempre in esecuzione letterale / partita. Sì, questa ottimizzazione non farà alcuna differenza per le prestazioni reali, ma voglio solo chiarire alcune ambiguità.

risposta

7

Dal wiki:

location =/{ 
    # matches the query/only. 
    [ configuration A ] 
} 
location/{ 
    # matches any query, since all queries begin with /, but regular 
    # expressions and any longer conventional blocks will be 
    # matched first. 
    [ configuration B ] 
} 

Quindi, questo sarà abbinato prima: location ~ \.php$ {}

Anche se le attività sono serviti di location/{}

All'interno del blocco php si desidera anche garantire contro caricamenti dannosi prima di passare a fastcgi:

if ($uri ~* "^/uploads/") { 
    return 404; 
} 

Come si può vedere nginx funziona un po 'diversamente da come ci si potrebbe aspettare.

+0

Non sono ancora chiaro il motivo per cui la regex dovrebbe corrispondere per prima. concesso non ci sono "=" direttive. il prossimo è "Tutte le restanti direttive con stringhe convenzionali". '/' è una stringa convenzionale e deve essere abbinata prima di qualsiasi regex. l'intero stringhe-poi-regex è un nginx implicito di ottimizzazione della mano che sembra fare qui, il che rende impossibile determinare il vero ordine della valutazione. Penso che apache/iptables, ecc., lo faccia correttamente elaborando in modo prevedibile nello stesso ordine definito come un blocco if/else-if/else. senza implicite regole "più/meno" specifiche. – leeoniya

+0

Bene, questo è sicuramente un po 'di confusione su nginx, in particolare su 'if' di nginx che dovrebbe essere usato solo per riscrittura/ritorno. Penso che stiano lavorando per semplificare questo. Per la tua situazione funzionerà in questo modo: 1. php regex controlla con un arresto se è una corrispondenza 2./per qualsiasi contenuto statico. – m33lky

+0

non sei corretto sull'ordine. il punto principale di avere la regola/assets come una stringa prima è evitare il sovraccarico dell'esecuzione della regex di php su ogni richiesta. infatti, VOGLIO servire qualcosa come assets/docs/example.php senza passarlo attraverso FCGI. Attualmente sto eseguendo questa configurazione e la regex NON cattura per example.php. è ordinato come^~/assets, /, ~ \ .php $ |/$ – leeoniya

Problemi correlati