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