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

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

使用nginx 1.2.1add_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在一个中使用会阻止在另一个中使用它。

Q1:您知道这是一个错误还是预期的行为以及原因是什么?

问题 2:除了使用HttpHeadersMoreModule模块?

答案1

这是预期行为。这些指令与 nginx 中所有其他数组类型指令非常相似,当且仅当当前级别上add_header没有定义指令时,才会从上一级继承。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指令来实现这一点。请参阅文档这里

相关内容