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


11

使用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

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

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

ドキュメントには、両方のことを言うserverとはlocation有効であるcontextと使用していることを述べるいないadd_header他にそれを使用して1つの防止に。

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

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

回答:


18

これは予想される動作です。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、これにディレクティブを使用できます。こちらのドキュメントをご覧ください


add_headerlocationディレクティブの内部しか持っていませんが、まだこのヘッダーが追加されていません-アイデアはありますか?
アディティアMP

@adityamenonひとつだけadd_headerですか?はいの場合、応答コードがdocsからのものであることを確認してください、nginx.org / r / add_headerを参照してください。
マキシムDounin

こんにちはマキシム、私はいくつかの異なる問題がありました、私は最終的に動作する設定を持っています:stackoverflow.com/a/19135714/443219
Aditya MP

これを説明するnginxのドキュメントへのリンク:nginx.org/en/docs/http/ngx_http_headers_module.html#add_header
Siliconrockstar
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.