位置中的 add_header 指令覆盖服务器中的 add_header 指令

Max*_*Max 19 ubuntu nginx http-headers

使用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";
    }
}
Run Code Online (Sandbox Code Playgroud)

结果

GET /
HTTP/1.1 200 OK
Name1: Value1
Name2: Value2
Run Code Online (Sandbox Code Playgroud)

但是,我一使用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";
    }
}
Run Code Online (Sandbox Code Playgroud)

结果

GET /
HTTP/1.1 200 OK
Name3: Value3
Name4: Value4
Run Code Online (Sandbox Code Playgroud)

文件说,双方serverlocation是有效的context,并没有在使用状态add_header中的一个防止在其他使用它。

Q1:你知道这是一个错误还是预期的行为,为什么?

Q2:除了使用HttpHeadersMoreModule模块之外,您是否还有其他选项可以解决此问题?

Max*_*nin 23

这是预期的行为。这些add_header指令与 nginx 中的所有其他数组类型指令非常相似,当且仅当add_header在当前级别上没有定义指令时,才从上一级继承。

如果你想让 nginxlocation /location /.

location / {
    add_header Name1 Value1;
    add_header Name2 Value2;
    add_header Name3 Value3;
    add_header Name4 Value4;
    return 200 "";
}
Run Code Online (Sandbox Code Playgroud)

如果您需要一种方法在一个地方列出大的标题子集,您可以include为此使用指令。请参阅此处的文档。