RequestHeader com variável de ambiente Apache

13

Eu tenho o Apache configurado como um balanceador de carga. Eu queria fazer o apache definir o cabeçalho X-Forwarded-Proto, mas isso não funciona:

RequestHeader set X-Forwarded-Proto "%{SERVER_PROTOCOL}e"

O cabeçalho é definido como nulo. Alguma idéia do porquê?

John Crenshaw
fonte

Respostas:

15

Tarde, mas ainda assim, acabei de lidar com o mesmo problema, e isso funcionou para mim:

RequestHeader set X_FORWARDED_PROTO 'https' env=HTTPS

A documentação diz:

Quando a diretiva RequestHeader é usada com o argumento add, append ou set, um quarto argumento pode ser usado para especificar condições sob as quais a ação será executada. Se a variável de ambiente especificada no argumento env = ... existir (ou se a variável de ambiente não existir e env =! ... for especificada), a ação especificada pela diretiva RequestHeader entrará em vigor. Caso contrário, a diretiva não terá efeito sobre a solicitação.

Enquanto a variável de ambiente HTTPS é configurada apenas quando a solicitação é feita por SSL.

iNecas
fonte
3
De acordo com en.wikipedia.org/wiki/List_of_HTTP_header_fields, o cabeçalho deve ter hífens em vez de sublinhados: RequestHeader define X-Forwarded-Proto 'https' env = HTTPS Este também é o cabeçalho que o ELB da Amazon envia.
loevborg
9

Você não quer isso; definiria o cabeçalho como "HTTP / 1.1" (mesmo em uma solicitação https) - provavelmente não é muito útil para o que você está passando.

Você tem diferentes blocos do VirtualHost para http e https; apenas codifique a RequestHeaderconfiguração em cada uma.

<VirtualHost *:80>
    RequestHeader set X-Forwarded-Proto "http"
    ...
</VirtualHost>

<VirtualHost *:443>
    RequestHeader set X-Forwarded-Proto "https"
    ...
</VirtualHost>
Shane Madden
fonte
1
Isso ainda não responde à pergunta de por que as variáveis ​​de ambiente não estão funcionando. Eu também queria preservar a porta e alguns outros valores, alguns dos quais não podem ser codificados como este.
John Crenshaw
3

Você pode corrigir isso usando a earlypalavra-chave:

RequestHeader set X-Forwarded-Proto "https" early

Caso contrário, você pode fazer o que John Crenshaw sugeriu, que é o uso em RewriteRulevez de ProxyPassdiretivas.

docwhat
fonte
1
Como posso depurar se o apache está realmente enviando esse cabeçalho?
Codecowboy
2

Encontrou a causa. Acontece que é uma questão de ordem de operações. O mod_rewrite é responsável por fornecer essas variáveis ​​de ambiente, mas o Apache não o processa até APÓS o tratamento de quaisquer solicitações do ProxyPass. Até lá, ele apenas definirá nulo. A única solução alternativa parece ser fazer a proxy via mod_rewrite.

Consulte http://www.gossamer-threads.com/lists/apache/users/267160?do=post_view_threaded#267160

John Crenshaw
fonte