Detectando pedidos HTTPS em PHP

O problema que estou tendo tem a ver com a necessidade de manter algumas URLs de um site protegido pelo HTTPS e o resto é lançado no HTTP.

Normalmente, você tem $_SERVER['HTTP_HTTPS'] ou $_SERVER['HTTPS'] (dependendo do seu sabor do Apache). Você também pode verificar a porta – é 80 para tráfego normal e 443 para HTTPS.

O meu problema é que o certificado se insere no loadbalancer e todas essas variables ​​não estão disponíveis, e o servidor web vê http://www.foo.com na porta 80. Uma maneira de corrigir isso é dizer ao loadbalancer para enviar o tráfego em uma porta diferente, mas me pergunto se existem outras maneiras de detectar o HTTPS do balanceador de carga?

Se o balanceador de carga for o outro fim da conexão SSL, você não pode obter mais informações do que o balanceador de carga fornece explicitamente. Gostaria de adicionar um header http, talvez já esteja fazendo isso, despeje todos os headers HTTP e olhe.

Como outra solução, você pode fazer o redirecionamento no balanceador de carga com base no URL.

Se alguém tiver o mesmo problema por trás de um Amazon AWS Elastic Load Balancer, a solução é simples porque a variável $_SERVER includeá:

 [HTTP_X_FORWARDED_PORT] => 443 [HTTP_X_FORWARDED_PROTO] => https 

Então, para obter o protocolo, você poderia usar:

 function getRequestProtocol() { if(!empty($_SERVER['HTTP_X_FORWARDED_PROTO'])) return $_SERVER['HTTP_X_FORWARDED_PROTO']; else return !empty($_SERVER['HTTPS']) ? "https" : "http"; } 

$ _SERVER [‘HTTP_X_FORWARDED_PROTO’] parece ser uma boa solução para os usuários do joomla, porque se o seu loadbalancer faz a redirecionamento e você configura a configuração force_ssl para 1 ou 2, você terminará em um loop infinito porque o joomla sempre vê http: