2009-01-16 25 views
17

El problema que estoy teniendo tiene que ver con la necesidad de mantener algunas URL de un sitio web protegido por HTTPS y el resto pateado a HTTP.Detectando solicitudes HTTPS en PHP

Normalmente, tiene $_SERVER['HTTP_HTTPS'] o $_SERVER['HTTPS'] (dependiendo de su sabor de Apache). También puede verificar el puerto: 80 para el tráfico normal y 443 para HTTPS.

Mi problema es que el certificado se sienta en el equilibrador de carga, y todas estas variables no están disponibles, y el servidor web ve http://www.foo.com en el puerto 80. Una forma de solucionar este problema es para decirle al equilibrador de carga para enviar el tráfico en una diferente puerto, pero me pregunto si hay otras formas de detectar HTTPS provenientes del equilibrador de carga?

Respuesta

14

Si el equilibrador de carga es el otro extremo de la conexión SSL, no puede obtener más información de la que proporciona explícitamente el equilibrador de carga. Me gustaría agregar un encabezado http, ya puede estar haciendo eso, volcar todos los encabezados HTTP y mirar.

Como otra solución, puede hacer la redirección en el equilibrador de carga en función de la URL.

+0

Sí, buena respuesta hayalci. Acabo de analizar este mismo problema (en un sitio que creo que también tiene equilibrio de carga) y parece que la única forma en que puedo identificar el uso de HTTPS es a través del encabezado 'HTTP_NOSSL'. Verdadero significa HTTP, falso significa HTTPS. –

38

Si alguien tiene el mismo problema detrás de un equilibrador de carga de Amazon AWS Elastic, la solución es simple porque la variable $_SERVER incluirá:

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

Por lo tanto, para obtener el protocolo, que puede usar:

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

¿Hay algún caso donde '$ _SERVER ['HTTP_X_FORWARDED_PROTO']' no se incluya en la var $ _SERVER? – eipark

+0

@eipark seguro desde su encabezado de conjunto de clientes, pero hay devolución condicional. – Zaffy

+0

@elpark Hasta que esté detrás de un equilibrador de carga Aws, diría que no, ya que es una característica documentada: http://aws.typepad.com/aws/2010/10/ keeping-customers-happy-another-new- elastic-load-balancecer-feature.html. – mrucci

2

$ _SERVER ['HTTP_X_FORWARDED_PROTO'] parece ser una buena solución para los usuarios de joomla porque si su loadbalancer hace la redirección y establece el ajuste force_ssl en 1 o 2, terminará en un bucle infinito porque joomla siempre ve http: