Inoltra intestazione personalizzata dal proxy inverso Nginx


25

Ho un web server nginx che funge da proxy inverso per inoltrare richieste ad Apache per ulteriore gestione (ti sto chiedendo di non chiedere perché). Ho una richiesta a cui sto provando a collegare un'intestazione personalizzata e vorrei che nginx inoltrasse tale intestazione personalizzata ad Apache in modo da poter fare qualcosa con essa in un'app.

Ho sfogliato i HttpProxyModuledocumenti, ma non sono molto descrittivi anche se sono nel posto giusto (potrebbe benissimo essere che non lo sono).

Come posso ottenere nginx per inoltrare X-CUSTOM-REFERRERun'intestazione? Inoltre, se possibile, mi piacerebbe che avanzasse lungo qualsiasi intestazione personalizzata che arriva. Se quest'ultimo è troppo da chiedere, il primo sarebbe sufficiente per il mio attuale bisogno.

Come puoi vedere, sono molto nuovo su nginx, quindi la versione correttiva sarebbe utile.

Grazie.

AGGIORNARE

Il frammento pertinente dalla mia configurazione esistente:

location / {
    proxy_pass                  http://preview;
    proxy_redirect              off;
    proxy_set_header            Host $host;
    proxy_set_header            X-Real-IP $remote_addr;
    proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
    # proxy_set_header            X-Custom-Referrer $x_custom_referrer;
}

Risposte:


20

La proxy_set_headerdirettiva da HttpProxyModule ti consente di farlo. Per esempio:

proxy_pass http://apachehost;
proxy_set_header X-Custom-Referrer $proxy_add_<header_field_name_from_last_request>;

1
Grazie @mgorven. Il valore in entrata è variabile, tuttavia. Posso leggere un valore dall'intestazione in arrivo X-Custom-Referrere passarlo? proxy_set_header X-Custom-Referrer $x_custom_referrero qualcosa in tal senso?
Rob Wilkerson,

1
Sì, puoi usare $http_x_custom_referrer. Tuttavia, tutte le intestazioni inviate dal client devono essere passate automaticamente al back-end. Ti sei messo proxy_pass_request_headers offda qualche parte?
mgorven

Non che io possa vedere. Ho aggiornato la mia domanda con uno snippet dal mio file di configurazione. Quell'intestazione sicuramente non arriva all'app, però. Detto questo, sto supponendo che le app di origine lo stiano inviando, quindi farò la mia dovuta diligenza ed essere sicuro che dovrebbe essere il comportamento predefinito.
Rob Wilkerson,

@RobWilkerson nel tuo snippet proxy_set_headerviene commentato il relativo ; inoltre stai usando $x_custom_referrerinvece di $http_x_custom_referrer...
severin

Penso che la risposta di @ mgorven dovrebbe essere aggiornata per essere $http_<custom_header_field>invece di$proxy_add_<custom_header_field>
Tri Nguyen l'

2

Il modulo ngx_headers_more consente di modificare e aggiungere intestazioni http.


Questo modulo aggiunge le intestazioni alla risposta. Non è quello che l'OP chiede. Devono inviare un'intestazione aggiuntiva all'upstream, in a proxy_pass.
Victor Schröder,

1

È possibile utilizzare intestazioni upstream (denominate che iniziano con $ http_) e intestazioni personalizzate aggiuntive. Per esempio:

add_header X-Upstream-01 $http_x_upstream_01;
add_header X-Hdr-01  txt01;

quindi, vai alla console ed effettua la richiesta con l'intestazione dell'utente:

curl -H "X-Upstream-01: HEADER1" -I http://localhost:11443/

la risposta contiene X-Hdr-01, impostato dal server e X-Upstream-01, impostato dal client:

HTTP/1.1 200 OK
Server: nginx/1.8.0
Date: Mon, 30 Nov 2015 23:54:30 GMT
Content-Type: text/html;charset=UTF-8
Connection: keep-alive
X-Hdr-01: txt01
X-Upstream-01: HEADER1

1
Questo sta impostando le intestazioni sulla risposta. L'OP vuole impostare le intestazioni da inviare a monte di una proxy_passdirettiva.
Victor Schröder,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.