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_headerdirectives. These directives are inherited from the previous level if and only if there are noadd_headerdirectives defined on the current level.
現在のコンテキストに add_header が書かれいていない場合に限り、上位コンテキストで記載されている add_header の設定を引き継ぐという説明です。
よって、下位のコンテキストで add_header を宣言する場合には同じ設定を書くか、more_set_headers を使用するとよいと思います。
知らないと少々ハマりそうな問題だと思ったので、参考になればと思います。
 
											 
											 
											 
											 
											