Wie füge ich bei Verwendung von proxy_pass einen Antwortheader zu nginx hinzu?

90

Ich möchte einen benutzerdefinierten Header für die Antwort hinzufügen, die vom Server hinter nginx empfangen wurde.

Funktioniert zwar add_headerfür von Nginx verarbeitete Antworten, tut jedoch nichts, wenn das proxy_passverwendet wird.

Sorin
quelle
Sie übergeben also die Anfrage an den Proxy und die Antwort des Proxy-Sets. Bei dieser Antwort möchten Sie Ihren benutzerdefinierten Header hinzufügen, bevor er an den Benutzer gesendet wird. Ist das richtig?
Emka86

Antworten:

29

Es gibt ein Modul namens HttpHeadersMoreModule , mit dem Sie mehr Kontrolle über Header haben. Es wird nicht mit Nginx geliefert und erfordert eine zusätzliche Installation. Damit können Sie so etwas tun:

location ... {
  more_set_headers "Server: my_server";
}

Dadurch wird "der Server-Ausgabeheader für jeden Statuscode und jeden Inhaltstyp auf den benutzerdefinierten Wert gesetzt". Es ersetzt bereits gesetzte Header oder fügt sie hinzu, wenn sie nicht gesetzt sind.

Sebastian Goodman
quelle
Ist es möglich, ein Antwort-Cookie hinzuzufügen Secureund HttpOnlyzu kennzeichnen ? Das Zielantwort-Cookie enthält jedoch nur das Cookie nameund die expireAttribute.
JPaulPunzalan
2
Sie benötigen nicht unbedingt eine Bibliothek, um Antwortheader ändern oder hinzufügen zu können. Im Gegensatz zu der am besten bewerteten Antwort können Sie einen Header überschreiben. Sie müssen ihn lediglich zuerst entfernen. Überprüfen Sie meine Antwort unten für Details.
Wilt
154

add_headerfunktioniert sowohl mit proxy_passals auch ohne. Ich habe gerade heute eine Konfiguration eingerichtet, in der ich genau diese Anweisung verwendet habe. Ich muss allerdings zugeben, dass ich mich ebenfalls bemüht habe, dies einzurichten, ohne mich genau an den Grund zu erinnern.

Im Moment habe ich eine funktionierende Konfiguration, die (unter anderem) Folgendes enthält:

server {
    server_name  .myserver.com
    location / {
        proxy_pass  http://mybackend;
        add_header  X-Upstream  $upstream_addr;
    }
}

Vorher arbeitete nginx 1.7.5 add_header nur an erfolgreichen Antworten, im Gegensatz zu dem von Sebastian Goodman in seiner Antwort erwähnten HttpHeadersMoreModule .

Seit nginx können 1.7.5Sie das Schlüsselwort verwenden always, um benutzerdefinierte Header auch in Fehlerantworten einzuschließen. Beispielsweise:

add_header X-Upstream $upstream_addr always;

Einschränkung: Sie können den serverHeader-Wert nicht mit überschreiben add_header.

Oliver
quelle
40
Seit nginx 1.7.5 können Sie "immer" verwenden, um benutzerdefinierte Header in Fehlerantworten mit add_header aufzunehmen:add_header X-Upstream $upstream_addr always;
Shane
Wie auch immer, um ähnliche Funktionen zu haben, ohne die IP / Port-Kombination des Proxyservers verfügbar zu machen? zB X-Upstream: 10.10.10.10vs X-Upstream: 53c2d28edefdf501ab7c92e02a0c1687(md5 ist wahrscheinlich nicht hilfreich beim Maskieren der Infrastruktur, vermittelt aber die Idee).
Zamnuts
@zamnuts: Die Übergabe der Upstream-IP- und Portnummern ist nur ein Beispiel für die Verwendung der add_headerDirektive. Sie müssen sie überhaupt nicht senden.
Oliver
@Oliver, das ist mir bewusst, aber ich habe nach einer anderen alternativen / eindeutigen Upstream-ID als den IP- / Port-Nummern oder einer Verschleierung gefragt. Vielleicht ist meine Frage außerhalb des Rahmens und ich sollte einen neuen Beitrag erstellen :)
Zamnuts
@ Zamnuts: Ich würde vorschlagen, auch eine neue Frage zu stellen :-)
Oliver
25

Wie Oliver schreibt:

add_headerfunktioniert sowohl mit proxy_passals auch ohne.

Doch wie Shane schreibt, wie von Nginx 1.7.5, Sie passieren müssen , alwaysum zu bekommen , add_headerum Arbeit für Fehlerreaktionen, etwa so:

add_header  X-Upstream  $upstream_addr always;
Dmitry Minkovsky
quelle
5
Ich habe mich lange gefragt, warum meine Header nicht angezeigt wurden, und versucht, sie in den Serverblock, den Standortblock
usw. zu verschieben.
Ich auch :) und trotz dieser Antwort ist mir das neulich wieder passiert. Musste meine eigene Antwort überprüfen.
Dmitry Minkovsky
14

Sie könnten diese Lösung ausprobieren:

locationWenn Sie in Ihrem Block Folgendes verwenden, proxy_passgehen Sie wie folgt vor:

location ... {

  add_header yourHeaderName yourValue;
  proxy_pass xxxx://xxx_my_proxy_addr_xxx;

  # Now use this solution:
  proxy_ignore_headers yourHeaderName // but set by proxy

  # Or if above didn't work maybe this:
  proxy_hide_header yourHeaderName // but set by proxy

}

Ich bin mir nicht sicher, ob es genau das ist, was Sie brauchen, aber versuchen Sie es mit einer Manipulation dieser Methode, und vielleicht passt das Ergebnis zu Ihrem Problem.

Sie können auch diese Kombination verwenden:

proxy_hide_header headerSetByProxy;
set $sent_http_header_set_by_proxy yourValue;
emka86
quelle
6
Ich musste diese Methode verwenden, da nginx einen doppelten Header hinzufügte, anstatt den vorhandenen zu überschreiben. location / { proxy_pass http://127.0.0.1:8080/; proxy_hide_header "Access-Control-Allow-Origin"; if ($http_origin ~* "^https://(example.com|www.example.com)$") { add_header Access-Control-Allow-Origin "$http_origin"; } }
Ether6
11

Blenden Sie den Antwortheader aus und fügen Sie dann einen neuen benutzerdefinierten Headerwert hinzu

Das Hinzufügen eines Headers mit add_headerfunktioniert einwandfrei mit dem Proxy-Pass. Wenn jedoch in der Antwort ein Header-Wert vorhanden ist, werden die Werte gestapelt.

Wenn Sie einen Header-Wert festlegen oder ersetzen möchten (z. B. den Access-Control-Allow-OriginHeader so ersetzen , dass er Ihrem Client entspricht, um die gemeinsame Nutzung von Ressourcen zwischen verschiedenen Ursprüngen zu ermöglichen), haben Sie folgende Möglichkeiten:

# 1. hide the Access-Control-Allow-Origin from the server response
proxy_hide_header Access-Control-Allow-Origin;
# 2. add a new custom header that allows all * origins instead
add_header Access-Control-Allow-Origin *;

In proxy_hide_headerKombination mit erhalten add_headerSie also die Möglichkeit, Antwortheaderwerte festzulegen / zu ersetzen.

Eine ähnliche Antwort finden Sie hier auf ServerFault

AKTUALISIEREN:

Hinweis: proxy_set_header dient zum Festlegen von Anforderungsheadern, bevor die Anforderung weiter gesendet wird, nicht zum Festlegen von Antwortheadern (diese Konfigurationsattribute für Header können etwas verwirrend sein).

Verwelken
quelle
Danke, große Hilfe
Lancer.Yan