2015-08-19 11 views
8

są następujące dwa bloki serwerów nginx semantycznie takie same, czy jest jakaś różnica? Czy konfiguracja specyficzna dla JSON w pierwszym przykładzie dziedziczy ustawienia "/"? Czy to w drugim przykładzie?Dziedziczenie dyrektywy w blokach lokalizacji zagnieżdżonej

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

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

Odpowiedz

11

Dziedziczenie dyrektyw konfiguracyjnych w Nginx jest taka, że ​​dyrektywy mogą być dziedziczone tylko od kontekstów wyżej w drzewie konfiguracji i nigdy z kontekstów na tym samym poziomie lub niższym.

Zatem blok lokalizacyjny nie może dziedziczyć z innego bloku lokalizacji, ale zagnieżdżony blok lokalizacyjny może dziedziczyć z bloku nadrzędnej lokalizacji.

Podkreśliłem można ponieważ istnieje wiele różnych rodzajów dyrektyw, a zachowanie spadków jest nieco inne dla każdego.

  1. Istnieją standardowe Dyrektywy typu, które mają tylko jeden zestaw wartości lub wartości załączeniu. Zostaną one po prostu odziedziczone przez konteksty niższe w drzewie konfiguracji lub zastąpione w tym niższym kontekście nowymi wartościami . Przykładem jest "indeks".

  2. Dyrektywy typu tablicowego, które przekazują wiele oddzielnych wartości w tablicy . Będą one po prostu dziedziczone przez konteksty znajdujące się niżej w drzewie konfiguracji lub zastąpione w tym niższym kontekście nowymi wartościami. Pamiętaj, że nie możesz dodać do tablicy. Zmiana części polega na zastąpieniu go wszystkimi. Przykładem jest "proxy_param". Jeśli więc zdefiniujesz proxy_param A i proxy_param B na poziomie serwera na przykład, a następnie spróbuj zdefiniować proxy_param C w kontekście lokalizacji, "A" i "B" będą wymazywane (ustawione na wartości domyślne). jako definiujące "C" oznaczało zastąpienie tablicy.

  3. Typy poleceń Dyrektywy takie jak "try_files" w ogóle nie są dziedziczone.

W związku z pańskim pytaniem, dyrektywy zdefiniowane w jednym kontekście nie mogą być dziedziczone przez inne, jak w drugim przykładzie.

Dyrektywy typu Standard i Array zdefiniowane w bloku lokalizacji macierzystej będą dziedziczone przez zagnieżdżony blok lokalizacji. Dyrektywy typu poleceń zdefiniowane w rodzicu nie będą ogólnie dziedziczone.

+17

'proxy_pass' także [nie jest dziedziczone przez lokalizację zagnieżdżoną] (https://forum.nginx.org/read.php?2,243488,243488). – saaj

+0

'uwsgi_pass' również nie jest dziedziczone. – Rockallite

+2

Czy jest jakaś cholerna tabela referencyjna, którą można skonsultować, aby wiedzieć, która dyrektywa jest lub nie jest dziedziczona? Jaki ból musi przyjść do SO, a następnie kliknąć na link w komentarzu, wskazując na inne forum, czytając, kto wie, że "proxy_pass nie jest dziedziczone" –

Powiązane problemy