[Nginx] add_header が反映されない上書き問題と解決方法

Nginx で add_header を異なるディレクティブに書くと設定が反映されず、上書きされてしまう問題とその解決方法をご紹介します。

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.

Module ngx_http_headers_module

Nginx add_header サンプルコード

Nginx add_header ダメな例(上書き問題)

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;
  }
}

Nginx add_header 正しい例

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 上書き問題を解決した、現場からお送りしました。

参考情報