Nginx でadd_headerを複数箇所に書く際の注意点
Nginxの設定ファイルでヘッダーを追加する場面は当然あると思います。
そんなとき server ディレクティブで add_header することですべての location ディレクティブにも設定が入れられます。
しかし、特定の location ディレクティブにおいて、 ヘッダーを追加したい場合があります。
例えば、Nginx + PHP-FPM 構成において、CSS などの静的ファイルには add_header したくないが、 PHP から返されるページ(html)には add_header したい場合です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
server { listen 80; server_name example.com; root /var/www/html; index index.php index.html index.htm; access_log /var/log/nginx/access.log main; error_log /var/log/nginx/error.log; add_header X-Frame-Options SAMEORIGIN; add_header X-XSS-Protection "1; mode=block"; add_header X-Content-Type-Options nosniff; add_header Strict-Transport-Security max-age=15768000; ---省略--- location ~ \.php$ { add_header Cache-Control "no-cache, no-store"; add_header Pragma no-cache; ---省略--- } } |
ここで注意(問題)があります。
上記のように設定してしまうと、 「location ~ ¥.php$」から返されるレスポンスには、上位のコンテキストである server ディレクティブで add_header した設定は消えてしまします。
ブラウザや curl などで確認すると add_header したヘッダーが消えている、もしくは効いていないように感じるかもしれません。
しかし、これは Nginx の仕様でありドキュメントにも記載があります。
Module ngx_http_headers_module
There could be several
add_header
directives. These directives are inherited from the previous level if and only if there are noadd_header
directives defined on the current level.
現在のコンテキストに add_header が書かれいていない場合に限り、上位コンテキストで記載されている add_header の設定を引き継ぐという説明です。
よって、下位のコンテキストで add_header を宣言する場合には同じ設定を書くか、more_set_headers を使用するとよいと思います。
知らないと少々ハマりそうな問題だと思ったので、参考になればと思います。