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