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:
~
Per maiuscole e minuscole corrispondenti~*
Per case insensitive corrispondenza
Come si esegue il match:
Direttive con il prefisso
=
che corrispondono esattamente alla query. Se trovato, la ricerca si interrompe.Tutte le direttive rimanenti con stringhe convenzionali. Se questa corrispondenza utilizza il prefisso
^~
, la ricerca si interrompe.Espressioni regolari, nell'ordine in cui sono definite nel file di configurazione.
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:
servire qualcosa di letterale
/assets
direttamente. STOP RICERCA.Serve tutto ciò che corrisponde RegExp
\.php$|/$
tramite fast-CGI STOP SEARCH.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à.
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
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
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