Nginx で add_header を異なるディレクティブに書くと設定が反映されず、上書きされてしまう問題とその解決方法をご紹介します。
 
今回の背景は、以下の Nginx add_header ダメな例(上書き問題) に記載しているような Nginx の設定で問題が発生しました。
server ディレクティブに add_header を記述して、location ディレクティブにも add_header を記述すると、server ディレクティブの add_header の設定がすべて消えてしまう仕様を把握してなかったのが問題でした。
There could be several add_header directives. These directives are inherited from the previous level if and only if there are no add_header directives defined on the current level.
server {
  listen 443 default ssl http2;
  server_name  your.example.com;
  add_header X-Frame-Options SAMEORIGIN always;
  add_header Strict-Transport-Security "max-age=31536000; preload" always;
  location = /robots.txt {
    # X-Frame-Options, Strict-Transport-Security の add_header 設定が上書きされて消える
    add_header content-type text/plain;
    default_type text/plain;
  }
}
server {
  listen 443 default ssl http2;
  server_name  your.example.com;
  add_header X-Frame-Options SAMEORIGIN always;
  add_header Strict-Transport-Security "max-age=31536000; preload" always;
  location = /robots.txt {
    # server ディレクティブと同じ内容の add_header を記述
    add_header X-Frame-Options SAMEORIGIN always;
    add_header Strict-Transport-Security "max-age=31536000; preload" always;
    add_header content-type text/plain;
    default_type text/plain;
  }
}
以上、Nginx add_header 上書き問題を解決した、現場からお送りしました。