Re: proxy_set_header и наследие

Maxim Dounin mdounin на mdounin.ru
Чт Мар 23 17:00:28 UTC 2017


Hello!

On Thu, Mar 23, 2017 at 06:18:21PM +0200, Vladimir Getmanshchuk wrote:

> Доброе время суток!
> 
> С этим proxy_set_header какой-то АД:
> 
> 1) Почему proxy_set_header дикректива уровнем ниже перетирает ВСЕ
> proxy_set_header уровнем выше, а не только тот хедер который ресетишь?

Так работает всё наследование всех директив в nginx'е.  Если вы 
задаёте что-то на каком-то уровне конфигурации, то наследования с 
предыдущих уровней - не будет.

Так сделано по ряду причин.  И не в последнюю очередь потому, что 
такие конфигурации читать проще - если вы видите, что что-то явно 
написано, не надо думать, какие ещё чудеса прилетят с других 
уровней и что будет в итоге.

Документация о таком поведение - явно говорит, 
http://nginx.org/ru/docs/http/ngx_http_proxy_module.html#proxy_set_header:

: Директивы наследуются с предыдущего уровня при условии, что на 
: данном уровне не описаны свои директивы proxy_set_header.

Не стоит удивляться такому поведению.  Вместо этого - стоит его 
понять и пользоваться преимуществами.

> 2) Если делаешь proxy_set_header дважды (иногда пересекается из-за
> include), то получаешь два хедера в HTTP запросе(от чего некоторые backends
> сходят с ума, когда видят два хедера Host(например).
> Почему не брать значение из последнего proxy_set_header?

В HTTP вполне допустимо использование нескольких одинаковых 
заголовков, более того - явно специфицировано, когда можно, а 
когда - нельзя, и как трактовать.  И во многих случаях это 
используется.

Было бы странно ограничивать людей в том, что они могут написать в 
конфиге, причём совсем не так, как специфицирует используемый 
протокол.

> Поймите правильно, не хочется писать proxy_set_header в каждом (вложенном
> тоже?) локейшене, а использовать наследие.

Не пишите, кто же вас заставляет.

В случае правильно и грамотно написанной конфигурации - обычно 
хватает одного набора директив proxy_set_header на уровне http, 
возможно - с отдельными вкраплениями "специальных" наборов.

Если очень нужно вносить локальные изменения в конкретных 
location'ах - можно использовать директиву include с неким базовым 
набором, дополняя его по необходимости.  Но если вы регулярно 
сталкиваетесь с подобной проблемой - скорее всего вы что-то 
делаете не так.

-- 
Maxim Dounin
http://nginx.org/


Подробная информация о списке рассылки nginx-ru