add_header-Direktiven am Speicherort überschreiben add_header-Direktiven im Server

11

Mit nginx 1.2.1 kann ich mehrere Header add_headerwie folgt hinzufügen :

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

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

Das Ergebnis

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

Sobald ich jedoch die darin enthaltene add_headerDirektive verwende location, werden die anderen add_headerDirektiven unter serverignoriert

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

Das Ergebnis

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

Die Dokumentation besagt, dass beide serverund locationgültig sind contextund nicht besagt, dass die Verwendung add_headerin einem die Verwendung in dem anderen verhindert.

Frage 1: Wissen Sie, ob dies ein Fehler oder das beabsichtigte Verhalten ist und warum?

F2: Sehen Sie andere Optionen, um dies zu beheben, als die Verwendung des HttpHeadersMoreModuleModuls?

Max
quelle

Antworten:

18

Dies ist erwartetes Verhalten. Die add_headerDirektiven werden, genau wie alle anderen Direktiven vom Array-Typ in nginx, genau dann von der vorherigen Ebene geerbt, wenn add_headerauf der aktuellen Ebene keine Direktiven definiert sind.

Wenn Sie möchten, dass nginx alle Header in der location /Liste hinzufügt , müssen Sie sie alle in location /auflisten, d. H.

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

Wenn Sie eine Möglichkeit benötigen, eine große Teilmenge von Headern an einer einzigen Stelle aufzulisten, können Sie hierfür die includeDirektive verwenden. Siehe Dokumente hier .

Maxim Dounin
quelle
Ich habe nur add_headerinnerhalb der locationDirektive, aber ich sehe immer noch nicht, dass dieser Header hinzugefügt wurde - irgendwelche Ideen?
Aditya MP
@adityamenon Hast du nur eine add_header? Wenn ja, stellen Sie sicher, dass ein Antwortcode aus den Dokumenten stammt (siehe nginx.org/r/add_header) .
Maxim Dounin
Hallo Maxim, ich hatte ein paar verschiedene Probleme, ich habe endlich eine Konfiguration, die funktioniert: stackoverflow.com/a/19135714/443219
Aditya MP
Link zu Nginx-Dokumenten, die dies erklären: nginx.org/en/docs/http/ngx_http_headers_module.html#add_header
siliconrockstar