web-dev-qa-db-ja.com

サーバーのadd_headerディレクティブを上書きする場所のadd_headerディレクティブ

nginx 1.2.1を使用して、次のようにadd_headerを使用して複数のヘッダーを追加できます。

server {
    listen       80;
    server_name  localhost;
    root /var/www;
    add_header Name1 Value1;      <=== HERE
    add_header Name2 Value2;      <=== HERE

    location / {
        echo "Nginx localhost site";
    }
}

結果

GET /
HTTP/1.1 200 OK
Name1: Value1
Name2: Value2

ただし、location内でadd_headerディレクティブを使用するとすぐに、serverの下の他のadd_headerディレクティブが無視されます

server {
    listen       80;
    server_name  localhost;
    root /var/www;
    add_header Name1 Value1;      <=== HERE
    add_header Name2 Value2;      <=== HERE

    location / {
        add_header Name3 Value3;  <=== HERE
        add_header Name4 Value4;  <=== HERE
        echo "Nginx localhost site";
    }
}

結果

GET /
HTTP/1.1 200 OK
Name3: Value3
Name4: Value4

documentation は、serverlocationの両方が有効なcontextであり、add_headerを1つで使用すると使用できないと述べていない他の。

Q1:これがバグなのか、それとも意図された動作なのか、そしてその理由を知っていますか?

Q2: HttpHeadersMoreModule モジュールを使用する以外に、これを修正する他のオプションがありますか?

11
Max

これは予想される動作です。 add_headerディレクティブは、nginxの他のすべての配列型ディレクティブと同様に、現在のレベルでadd_headerディレクティブが定義されていない場合にのみ、前のレベルから継承されます。

Nginxがlocation /にすべてのヘッダーを追加するようにしたい場合は、それらすべてをlocation /にリストする必要があります。

location / {
    add_header Name1 Value1;
    add_header Name2 Value2;
    add_header Name3 Value3;
    add_header Name4 Value4;
    return 200 "";
}

ヘッダーの大きなサブセットを1か所にリストする方法が必要な場合は、includeディレクティブを使用できます。 docs here を参照してください。

18
Maxim Dounin