2015-08-19 8 views
8

i seguenti due blocchi del server nginx semanticamente sono uguali o c'è qualche differenza? La configurazione specifica JSON nel primo esempio eredita le impostazioni della posizione "/"? Fa nel secondo esempio?Ereditarietà direttiva nei blocchi di posizione nidificati

server { 
    location/{ 
    # ... 
    location ~* \.json$ { 
      # json-specific settings 
    } 
    } 
} 

server { 
    location/{ 
    # ... 
    } 
    location ~* \.json$ { 
    # json-specific settings 
    } 
} 

risposta

11

La successione delle direttive di configurazione in Nginx è tale che le direttive possono essere ereditate solo contesti superiore nella struttura di configurazione e mai contesti sullo stesso livello o inferiore.

Quindi, un blocco di posizione non può ereditare da un altro blocco di posizione ma un blocco di posizione nidificato può ereditare dal blocco di posizione principale.

Ho sottolineato può perché ci sono un certo numero di diversi tipi di direttive e il comportamento di ereditarietà è un po 'diverso per ciascuno.

  1. ci sono direttive di tipo standard che hanno solo un valore o un insieme di valori allegati. Questi saranno semplicemente ereditati dai contesti inferiori nella struttura di configurazione o sostituiti all'interno di tale contesto inferiore con i nuovi valori . Un esempio è "indice".

  2. Direttive di tipo di matrice che superano più valori separati in un array . Questi saranno semplicemente ereditati dai contesti più in basso nella struttura di configurazione o sostituiti all'interno di tale contesto inferiore con nuovi valori. Nota che non è possibile aggiungere all'array. Cambiare parte è la sostituzione di tutti. Un esempio è "proxy_param". Quindi, se si definisce proxy_param A e proxy_param B a livello di server, per esempio, e quindi provare a definire proxy_param C in un contesto di ubicazione, "A" e "B" sarebbero stati cancellati (impostati su valori predefiniti). come definizione di "C" si intende sostituendo l'array.

  3. Le direttive di tipo comando come "try_files" in genere non sono ereditate da .

Così specificamente alla tua domanda, le direttive definite nel contesto del blocco una posizione non può essere ereditate da un altro come nel tuo secondo esempio.

Le direttive di tipo standard e di matrice definite nel blocco di posizione padre verranno ereditate dal blocco di posizione nidificato. Le direttive del tipo di comando definite nel genitore non saranno ereditate in generale.

+17

'proxy_pass' anche [non è ereditato da una posizione nidificata] (https://forum.nginx.org/read.php?2,243488,243488). – saaj

+0

Anche 'uwsgi_pass' non è ereditato. – Rockallite

+2

Esiste qualche tabella di riferimento che si possa consultare per sapere quale direttiva è o non è ereditata? Che dolore dover venire a SO quindi fare clic su un link in un commento, puntando su un altro forum, leggendo who-knows affermando che "proxy_pass non è ereditato" –

Problemi correlati