サーバー

【Nginx】add_headerが効かない場合

2020年8月31日

Content-TypeやAllowなどヘッダ情報をNginxで付与する場合は「add_header」を記載することで対応可能ですが、特定条件下において「add_header」が効かない場合があるようです。

serverとlocationに記載した場合

「Server」節と「location」節にadd_headerを付与した場合、「location」に記載した値のみ有効になります。

例えば下記conf情報の場合、http://xxxx.xx/index.htmlにアクセスした場合のヘッダー情報は「add_header Allow "GET, POST" always;」のみになります。

server {
    listen 443  ssl http2 default_server;
    server_name  xxx.xx;
    charset UTF-8;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
    add_header Allow "GET, POST, HEAD" always;
    add_header X-Content-Type-Options nosniff;

    location = /index.html {
        add_header Allow "GET, POST" always;
        root   /xxxx/html;
    }
}

公式ページにも「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.」と
前のディレクティブに「add_header」がない限りadd_headerを引き継ぐと記載されています。

なので、locationにadd_headerを付与する場合はServerで引き継ぎたい設定情報をコピーするか。
サードパーティーモジュールの使用が許されるならば「headers-more-nginx-module」を用いる方法があります。

 

「always」なしは特定HTTPステータスコードのみ

こちらも公式ページを見ると下記HTTPステータスコードのみヘッダー情報を返すようです。()内はnginxのバージョン

  • 200
  • 201 (1.3.10)
  • 204
  • 206
  • 301
  • 302
  • 303
  • 304
  • 307 (1.1.16, 1.0.13) or 308 (1.13.0)

REST APIなどHTTPステータスコードを上記以外で使用している場合や4xx系・5xx系で返却された場合はadd_headerが付与されなくなります。

そのため、全てのステータスコードに付与したい場合は「always」を追加します。

server {
    listen 443  ssl http2 default_server;
    server_name  xxx.xx;
    charset UTF-8;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" ;
    add_header Allow "GET, POST, HEAD" always;
    add_header X-Content-Type-Options nosniff ;


}

上記は「Allow "GET, POST, HEAD"」ヘッダのみ全てのステータスコードに追加するように設定しています。

 

「add_header」について理解しないとどこかでハマりそうなので覚えておいたほうがいいですね。

-サーバー
-,