2015-08-19 1 views
8

следующие два блока сервера nginx семантически одинаковы или есть какая-либо разница? Конфигурация JSON в первом примере наследует настройки местоположения «/»? Это во втором примере?Наследование директивы в блоках вложенных местоположений

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

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

ответ

11

Наследование директив конфигурации в Nginx таково, что директивы могут быть унаследованы только из контекста выше дерева конфигурации и никогда от контекста на том же уровне или ниже.

Таким образом, блок местоположения не может наследовать от другого блока местоположения, но вложенный блок местоположения может наследовать от родительского блока местоположения.

Я подчеркнул, что может, потому что существует несколько различных типов директив, и поведение наследования немного отличается для каждого.

  1. Существуют стандартные директивы типа, которые имеют только одно значение или набор значений прилагается. Они просто наследуются контекстами ниже вниз по дереву конфигурации или заменяются в этом нижнем контексте новыми значениями . Примером является «индекс».

  2. Директивы типа массива, которые передают несколько отдельных значений в массиве . Они будут просто наследоваться контекстами ниже в дереве конфигурации или заменяться в этом нижнем контексте новыми значениями. Обратите внимание, что вы не можете добавить в массив. Меняющаяся часть заменяет его все. Примером является «proxy_param». Поэтому, если вы определяете proxy_param A и proxy_param B на уровне сервера, а затем попробуйте определить proxy_param C в контексте местоположения, «A» и «B» будут уничтожены (установлены на значения по умолчанию). поскольку определение «C» означало , заменяющее массив.

  3. Директивы типа команды, такие как «try_files», как правило, не унаследованы от .

Так что конкретно на ваш вопрос директивы, определенные в одном контексте блока местоположения, не могут быть унаследованы другим, как в вашем втором примере.

Директивы типа Standard и Array, определенные в родительском блоке местоположения, будут наследоваться вложенным блоком местоположения. Директивы типа команд, определенные в родительском объекте, не будут наследоваться вообще.

+17

'proxy_pass' также [не наследуется вложенным местоположением] (https://forum.nginx.org/read.php?2,243488,243488). – saaj

+0

'uwsgi_pass' также не наследуется. – Rockallite

+2

Есть ли какая-нибудь проклятая справочная таблица, с которой можно консультироваться, знать, какая директива является или не унаследована? Какая боль должна прийти в SO, затем нажмите ссылку в комментарии, указав на другой форум, прочитав, кто знает, что «proxy_pass не унаследован», –

Смежные вопросы