directivas add_header en la ubicación sobrescribiendo las directivas add_header en el servidor

11

Usando nginx 1.2.1 puedo agregar múltiples encabezados usando add_headerlo siguiente:

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

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

El resultado

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

Sin embargo, tan pronto como uso la add_headerdirectiva en el interior location, se ignoran las otras add_headerdirectivas enserver

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

El resultado

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

La documentación dice que tanto servery locationson válidos contexty no afirme que el uso add_headerde uno impide usarlo en la otra.

P1: ¿Sabe si esto es un error o el comportamiento previsto y por qué?

P2: ¿Ves otras opciones para arreglar esto que no sea usar el HttpHeadersMoreModulemódulo?

Max
fuente

Respuestas:

18

Este es el comportamiento esperado. Las add_headerdirectivas, al igual que todas las demás directivas de tipo matriz en nginx, se heredan del nivel anterior si y solo si no hay add_headerdirectivas definidas en el nivel actual.

Si desea que nginx agregue todos los encabezados en el location /, debe enumerarlos todos location /, es decir

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

Si necesita una manera de enumerar un gran subconjunto de encabezados en un solo lugar, puede usar la includedirectiva para esto. Ver documentos aquí .

Maxim Dounin
fuente
Solo tengo add_headerdentro de la locationdirectiva, pero todavía no veo este encabezado agregado, ¿alguna idea?
Aditya MP
@adityamenon ¿Tienes solo uno add_header? En caso afirmativo, asegúrese de que el código de respuesta sea uno de los documentos, consulte nginx.org/r/add_header .
Maxim Dounin
Hola Maxim, tuve un par de problemas diferentes, finalmente tengo una configuración que funciona: stackoverflow.com/a/19135714/443219
Aditya MP
Enlace a documentos de nginx que explican esto: nginx.org/en/docs/http/ngx_http_headers_module.html#add_header
siliconrockstar