nginx add_header
Maxim Dounin
mdounin на mdounin.ru
Вт Июл 21 13:31:02 UTC 2020
Hello!
On Fri, Jul 17, 2020 at 04:23:02PM -0400, nkatsy wrote:
> Хм, неожиданно. Но так и есть.
> В server был другой add_header.
> Не логичнее ли было бы наследовать, с http, то что не оговоренно в server?
Именно так и делается - если директивы add_header не оговорены в
секции server, то они наследуются. Если оговорены - не
наследуются.
Вы же, судя по всему, под "не оговорено" понимаете попытки по
каким-то правилам "склеить" директивы add_header с уровня http и
директивы add_header с уровня server. Так не логичнее как минимум
по двум причинам:
1. С точки зрения кода проще и логичнее наследовать значение или
массив значений целиком, а не пытаться "склеить" комбинацию из
разных массивов. Тем более, что завтра окажется, что нужен и
"add_header Set-Cookie foo=1;" с уровня http, и "add_header
Set-Cookie bar=2;" с уровня server, а вот "add_header Set-Cookie
bazz=1;" с уровня http - не нужен, и как их правильно "склеивать"
совершенно непонятно.
2. Чтобы наследовать, надо уметь это наследование отменять.
Сейчас наследование отменяется просто по факту наличия
соответствующей директивы. В схеме же со "склеиванием"
понадобится вводить отдельную сущность для отмены наследования с
предыдущего уровня.
Поэтому приблизительно все директивы в nginx'е работают по одной и
той же простой схеме: если директива задана на текущем уровне, то
она не наследуется, если не задана - то наследуется. Исключения -
отдельные директивы, которые вообще не наследуются.
Из неочевидных плюсов: такая схема, в частности, в своё время
позволила ввести возможность использования нескольких директив
error_log на одном уровне без каких-либо проблем совместимости
конфигураций.
Кроме того, я бы тут ещё упомянул вопрос масштабируемости
конфигурации. Игорь подробно рассказывал об этом тут:
https://youtu.be/jf3wIN-FwW4
Текущая схема минимизирует как число мест, в которые надо
смотреть, чтобы понять конфигурацию (скажем, если на уровне
locationn есть директива add_header - можно быть уверенным, что
соответствующие директивы с других уровней на заголовки не
повлияют), так и возможные последствия от изменения конфигурации.
--
Maxim Dounin
http://mdounin.ru/
Подробная информация о списке рассылки nginx-ru