NGINX per sviluppatori: location parte 2

Marco Orlandin
2 min readJul 22, 2018

--

Approfondimento sui modificatori e sulle priorità di esecuzione

Quando essere ordinati non sempre serve.

Le direttive a blocco location seguono una struttura molto semplice:

location modificatore_opzionale location_match {
#altre direttive
}

Il location_match definisce ciò che NGINX deve controllare nell’URI che viene richiesta mentre la presenza o l’assenza del modificatore altera il comportamento decisionale di NGINX.

Modificatori:

  • (nessuno): se non ci sono modificatori la location verrà interpretata come un prefix, quindi il confronto sarà pari-pari tra match e URI
  • =: l’uguale indica che il blocco è da considerarsi un match se l’URI richiesta è identica
  • ~: il tilde indica che il match è un’espressione regolare case-sensitive
  • ~*: il tilde seguito da un asterisco indica che l’espressione regolare è case-insensitive
  • ^~: il cappelletto e il tilde indicano che se il blocco è stato scelto da NGINX come il miglior match non basato su espressione regolare, le altre eventuali espressioni regolari non verrano controllate.

Riassumendo, i modificatori indicano ad NGINX come i blocchi debbano essere interpretati.

L’obbiettivo di NGINX è di fornirti il contenuto più appropriato in base ai blocchi da lui identificati e per scegliere il blocco più appropriato segue il seguente approccio:

  • Blocchi prefix, tutte le location che non impiegano espressioni regolari. Ogni singola location viene confrontata con l’URI richiesta.
  • Blocchi identici ( = )
  • Blocchi con espressioni regolari, viene cercato il match più “lungo” (quello con più corrispondenze) e, qualora venisse trovato un ^~, la richiesta viene evasa immediatamente, in alternativa, se il blocco con il maggior numero di corrispondenze non usa il ^~, il match viene tenuto in memoria da NGINX come “buono se non ho alternative”.
  • Dopo che la location con il maggior numero di corrispondenze è stata trovata e memorizzata, NGINX procede alla valutazione di tutte le espressioni regolari.
    Se vengono trovate espressioni regolari compatibili vengono messe in una lista da controllare, la prima che produce un match positivo viene servita immediatamente.
  • Se nessuna espressione regolare produce un match viene servita la prima delle location che ha generato un match positivo.

Riassumendo, NGINX darà precedenza alle espressioni regolari anche se valuta per primi i prefix, dopodiché è possibile intervenire nel processo decisionale utilizzando i modificatori uguale = e i cappelletto-tilde ^~.

Se è vero quindi che non è importante l’ordine delle location prefix è fondamentale l’ordine delle location basate su espressioni regolari in quanto NGINX servirà la prima che individua, altrettanto fondamentale è comprendere che l’espressione regolare con il maggior numero di corrispondenze avrà una corsia preferenziale rispetto alle altre.

--

--

Marco Orlandin

Bearded IT Architect and Enthusiast; Food lover; Vegan; Bull Terrier roommate;