位置覆盖中的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

文档serverlocation都是有效的context,没有说明add_header在一个中使用会阻止在另一个中使用它。

问题1:您知道这是错误还是预期的行为,为什么?

问题2:除了使用该HttpHeadersMoreModule模块以外,您还看到其他解决方案来解决此问题吗?

Answers:


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 "";
}

如果需要在单个位置列出较大的标头子集的方法,则可以include为此使用指令。在这里查看文档。


我只有指令add_header内部location,但仍然看不到此标头-有什么想法吗?
Aditya MP

@adityamenon你只有一个add_header吗?如果是,则确保响应代码是docs中的一个,请参阅nginx.org/r/add_header
Maxim Dounin

嗨,Maxim,我遇到了几个不同的问题,我终于有了一个可以运行的配置:stackoverflow.com/a/19135714/443219
Aditya MP

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.