Encabezado personalizado hacia adelante desde el proxy inverso de Nginx

25

Tengo un servidor web nginx que actúa como proxy inverso para reenviar solicitudes a Apache para un manejo adicional (le ruego que no pregunte por qué). Tengo una solicitud a la que estoy tratando de adjuntar un encabezado personalizado y me gustaría que nginx reenvíe ese encabezado personalizado a Apache para poder hacer algo con él en una aplicación.

He revisado los HttpProxyModuledocumentos, pero no son muy descriptivos, incluso si estoy en el lugar correcto (muy bien podría ser que no lo estoy).

¿Cómo puedo hacer que nginx reenvíe un X-CUSTOM-REFERRERencabezado? Además, si es posible, me gustaría reenviar cualquier encabezado personalizado que venga. Si lo último es demasiado pedir, lo primero sería suficiente para mi necesidad actual.

Como puede ver, soy muy nuevo en nginx, por lo que la versión correctiva sería útil.

Gracias.

ACTUALIZAR

El fragmento relevante de mi configuración existente:

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;
}
Rob Wilkerson
fuente

Respuestas:

20

La proxy_set_headerdirectiva del HttpProxyModule le permite hacer esto. Por ejemplo:

proxy_pass http://apachehost;
proxy_set_header X-Custom-Referrer $proxy_add_<header_field_name_from_last_request>;
mgorven
fuente
1
Gracias @mgorven. Sin embargo, el valor entrante es variable. ¿Puedo leer un valor del X-Custom-Referrerencabezado entrante y pasarlo? proxy_set_header X-Custom-Referrer $x_custom_referrer¿O algo por el estilo?
Rob Wilkerson
1
Sí, puedes usar $http_x_custom_referrer. Sin embargo, todos los encabezados enviados por el cliente deben pasarse automáticamente al backend. ¿Te has puesto en proxy_pass_request_headers offalguna parte?
mgorven
No es que pueda ver. He actualizado mi pregunta con un fragmento de mi archivo de configuración. Sin embargo, ese encabezado definitivamente no está llegando a la aplicación. Dicho esto, estoy asumiendo que las aplicaciones de origen lo están enviando, así que haré mi debida diligencia y me aseguraré de que ese sea el comportamiento predeterminado.
Rob Wilkerson
@RobWilkerson en su fragmento proxy_set_headerse comenta el relevante ; también estás usando en $x_custom_referrerlugar de $http_x_custom_referrer...
severin
Creo que la respuesta de @ mgorven debería actualizarse para ser en $http_<custom_header_field>lugar de$proxy_add_<custom_header_field>
Tri Nguyen
2

El módulo ngx_headers_more le permite cambiar y agregar encabezados http.

Yohann
fuente
Este módulo agrega encabezados a la respuesta. Eso no es lo que pide el OP. Necesitan enviar un encabezado adicional a la cadena ascendente, en a proxy_pass.
Victor Schröder
1

Puede usar encabezados ascendentes (nombrados comenzando con $ http_) y encabezados personalizados adicionales. Por ejemplo:

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

a continuación, vaya a la consola y haga una solicitud con el encabezado del usuario:

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

la respuesta contiene X-Hdr-01, enviado por el servidor y X-Upstream-01, enviado por el cliente:

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
shcherbak
fuente
1
Esto es establecer encabezados en la respuesta. El OP quiere establecer encabezados para ser enviados a la parte superior de una proxy_passdirectiva.
Victor Schröder