add_header diretivas no local sobrescrevendo as diretivas add_header no servidor

10

Usando nginx 1.2.1 , posso adicionar vários cabeçalhos usando add_header da seguinte forma:

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

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

O resultado

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

No entanto, assim que eu usar a diretiva add_header dentro de location , as outras diretivas add_header sob server serão ignoradas

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

O resultado

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

A documentação diz que server e location são válidos context e não declaram que usando add_header em um evita usá-lo no outro.

Q1: Você sabe se isso é um bug ou o comportamento pretendido e por quê?

Q2: você vê outras opções para consertar isso do que usar o módulo HttpHeadersMoreModule ?

    
por Max 19.06.2012 / 17:47

1 resposta

16

Esse é o comportamento esperado. As diretivas add_header , bem como todas as outras diretivas do tipo array no nginx, são herdadas do nível anterior se e somente se não houver diretivas add_header definidas no nível atual.

Se você quiser que o nginx adicione todos os cabeçalhos no location / , será necessário listá-los todos em location / , ou seja,

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

Se você precisar de uma maneira de listar grandes subconjuntos de cabeçalhos em um único lugar, você pode usar a diretiva include para isso. Veja os documentos aqui .

    
por 23.09.2012 / 22:22