Encaminhar cabeçalho personalizado a partir do Nginx Reverse Proxy

25

Eu tenho um servidor web nginx atuando como um proxy reverso para encaminhar solicitações ao Apache para manipulação adicional (estou implorando para que você não pergunte o porquê). Eu tenho uma solicitação na qual estou tentando anexar um cabeçalho personalizado e gostaria que o nginx encaminhasse esse cabeçalho personalizado para o Apache, para que eu possa fazer algo com ele em um aplicativo.

Analisei os HttpProxyModuledocumentos, mas eles não são muito descritivos, mesmo que eu esteja no lugar certo (pode ser que eu não esteja).

Como faço para o nginx encaminhar um X-CUSTOM-REFERRERcabeçalho? Além disso, se possível, eu gostaria que fosse encaminhado ao longo de qualquer cabeçalho personalizado que chegasse. Se o último for pedir demais, o primeiro seria suficiente para a minha necessidade atual.

Como você pode ver, sou muito novo no nginx, portanto a versão corretiva seria útil.

Obrigado.

ATUALIZAR

O snippet relevante da minha configuração 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
fonte

Respostas:

20

A proxy_set_headerdiretiva do HttpProxyModule permite fazer isso. Por exemplo:

proxy_pass http://apachehost;
proxy_set_header X-Custom-Referrer $proxy_add_<header_field_name_from_last_request>;
mgorven
fonte
1
Obrigado, @mgorven. O valor recebido é variável, no entanto. Posso ler um valor do X-Custom-Referrercabeçalho de entrada e repassá-lo? proxy_set_header X-Custom-Referrer $x_custom_referrerou algo nesse sentido?
Rob Wilkerson
1
Sim, você pode usar $http_x_custom_referrer. No entanto, todos os cabeçalhos enviados pelo cliente devem ser passados ​​para o back-end automaticamente. Você já morou em proxy_pass_request_headers offalgum lugar?
mgorven
Não que eu possa ver. Atualizei minha pergunta com um trecho do meu arquivo de configuração. Esse cabeçalho definitivamente não está chegando ao aplicativo. Dito isso, estou assumindo que os aplicativos de origem o estão enviando, por isso vou fazer minha devida diligência e ter certeza se esse deve ser o comportamento padrão.
Rob Wilkerson
@RobWilkerson no seu snippet, o relevante proxy_set_headeré comentado; Também você está usando $x_custom_referrer, em vez de $http_x_custom_referrer...
Severin
Eu acho que a resposta de @ mgorven deve ser atualizada para ser em $http_<custom_header_field>vez de #$proxy_add_<custom_header_field>
Nguyen Tri #
2

O módulo ngx_headers_more permite alterar e adicionar cabeçalhos http.

Yohann
fonte
Este módulo adiciona cabeçalhos à resposta. Não é isso que o OP está pedindo. Eles precisam enviar um cabeçalho adicional para o upstream, em a proxy_pass.
Victor Schröder
1

Você pode usar cabeçalhos upstream (nomeados começando com $ http_) e cabeçalhos personalizados adicionais. Por exemplo:

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

Em seguida, acesse o console e faça a solicitação com o cabeçalho do usuário:

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

a resposta contém X-Hdr-01, configurado pelo servidor, e X-Upstream-01, configurado pelo 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
fonte
1
Isso está definindo cabeçalhos na resposta. O PO deseja definir cabeçalhos a serem enviados para a montante de uma proxy_passdiretiva.
Victor Schröder