Nginx gibt benutzerdefinierten Header zurück

13

Ich habe das folgende Beispiel

           location / {
                    proxy_read_timeout 2000;
                    proxy_next_upstream error;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header Host $http_host;
                    proxy_pass_header X_CUSTOM_HEADER;
                    proxy_redirect off;
                    proxy_max_temp_file_size 0;
                    proxy_pass https://prod;
                    break;
            }

Wenn ich jetzt die folgende Lockenlinie benutze

curl --head -H "X_CUSTOM_HEADER: foo" http://domain.com/api/test

Nun, das funktioniert nicht. Der Apache / PHP im Backend sieht den Header nicht. Wenn ich Nginx umgehe, funktioniert es

curl --head -H "X_CUSTOM_HEADER: foo" http://web1.domain.com/api/test
Mike
quelle

Antworten:

15

Sie sollten eine underscores_in_headers onAnweisung verwenden, die standardmäßig deaktiviert ist.

AlexD
quelle
Diese Information spart mir Stunden.
Morgan Cheng
Ich würde Ihnen gerne ein erfrischendes Getränk kaufen.
Ballmw
Sie, mein Herr, sind ein Gelehrter und ein Gentleman.
Eve Freeman
2

Sie sollten proxy_set_headerfür alle Header verwenden, die Sie an die Backend-Server weiterleiten möchten. Also statt proxy_pass_header ...Linie:

proxy_set_header X_CUSTOM_HEADER $http_x_custom_header;
Mikko
quelle
Ich habe das versucht und es setzt den Header nicht richtig. Wenn ich $ http_x_custom_header durch "foo" ersetze, funktioniert es
Mike
Ich bin mir nicht sicher, warum es bei @Mike nicht funktioniert hat, aber es hat bei mir funktioniert. Ich verwende X-Forwarded-Proto mit $ http_x_forwarded_proto.
Tyler Collier
2

Das obige hat auch bei mir nicht funktioniert, also habe ich es benutzt proxy_pass_header. Das Nginx-Wiki zu proxy_pass_header finden Sie hier .

Wenn Ihr benutzerdefinierter Header zu Ihrem Proxy-Block device_idhinzugefügt wird proxy_pass_header device_id;.

Wenn Sie benutzerdefinierte Header mit einem Unterstrich verwenden (wie ich), stellen Sie sicher, dass Sie diese underscores_in_headers onin Ihrer Nginx-Konfiguration haben.

user2700022
quelle
Vielen Dank ! Ich habe mir die Haare ausgezogen ... Ihr Beitrag hat mich entlastet ...
Fahad Ahammed
1

Standardmäßig leitet der Nginx alle ( proxy_pass_request_headers on; ) Header an den Backend-Server weiter. Wenn Ihr Anforderungsheader (möglicherweise ein benutzerdefinierter Header) einen Unterstrich (_) im Headernamen enthält, blockiert nginx diese Header.

Ex: authenticate_type, cdn_enable.

Damit Nginx alle oder den benutzerdefinierten angeforderten Header an das Backend übergeben kann, aktivieren Sie die Unterstrichoption.

underscores_in_headers on;
GangaRam Dewasi
quelle