Eu tenho um balanceador de carga TCP da AWS em um pool de escalonamento automático, existem vários domínios por trás dele, então não posso fazer a terminação SSL no balanceador de carga, portanto, TCP.
Eu atualizei meu formato de log para registrar o X-Forwarded-For e isso funciona bem para HTTP, mas não para HTTPS.
Os fóruns não indicam que isso não pode ser feito, pois fala sobre HTTP (S), mas não consigo fazê-lo funcionar. Pode funcionar?
Aqui estão os meus detalhes de registro:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" proxy
SetEnvIf X-Forwarded-For "^.*\..*\..*\..*" forwarded
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog "logs/access_log" combined env=!forwarded
CustomLog "logs/access_log" proxy env=forwarded
Despejando todos os atributos em PHP, posso ver o cabeçalho para solicitações HTTP, mas não HTTPS, então não acho que seja um problema de configuração.
O ELB não tem como adicionar esse cabeçalho, pois esse cabeçalho é uma função do HTTP e este é um balanceador de carga TCP. Tudo o que sabe é que está passando algum fluxo TCP e nada mais. Se você precisar que o ELB adicione esse cabeçalho, precisará encerrar o HTTPS no balanceador de carga. A partir daí, ele pode se comunicar com suas instâncias de back-end via HTTP ou HTTPS, conforme necessário.
Embora eu duvide muito que seja possível fazer o X-Forwarded-For funcionar quando a terminação SSL não estiver sendo feita no balanceador de carga, não encontrei um não definitivo. No entanto, há uma solução que fiz funcionar usando o CloudFront.
Como você pode ter várias distribuições apontando para um balanceador de carga e a AWS fornece certificados para SSL, você pode encerrar o SSL no ponto de presença. O CloudFront adicionará o cabeçalho e encaminhará a solicitação (se necessário) para o balanceador de carga. A partir daí, o cabeçalho chegará ao seu servidor.