diretivas add_header na substituição de local diretivas add_header no servidor

11

Usando o nginx 1.2.1, posso adicionar vários cabeçalhos usando add_headero seguinte:

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 uso a add_headerdiretiva por dentro location, as outras add_headerdiretivas abaixo serversã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 tanto servere locationsão válidos contexte não faz afirmar que o uso add_headerem um impede de usá-lo no outro.

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

P2: Você vê outras opções para corrigir isso do que usar o HttpHeadersMoreModulemódulo?

Máx.
fonte

Respostas:

18

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

Se você deseja que o nginx adicione todos os cabeçalhos no location /, você deve listá-los todos 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 um grande subconjunto de cabeçalhos em um único local, poderá usar a includediretiva para isso. Veja os documentos aqui .

Maxim Dounin
fonte
Eu só tenho add_headerdentro da locationdiretiva, mas ainda não vejo esse cabeçalho adicionado - alguma idéia?
Aditya MP
@adityamenon Você tem apenas um add_header? Se sim, verifique se o código de resposta é um dos documentos, consulte nginx.org/r/add_header .
Maxim Dounin
Oi Maxim, tive alguns problemas diferentes, finalmente tenho uma configuração que funciona: stackoverflow.com/a/19135714/443219
Aditya MP
Link para docs nginx explicar isso: nginx.org/en/docs/http/ngx_http_headers_module.html#add_header
siliconrockstar